c++(线性结构的处理)
我们知道,在内存中的空间都是连续的。也就是说,0x00000001下面的地址必然是0x00000002。所以,空间上是不会出现地址的突变的。那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆。数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理。所以从这个意义上说,掌握了数组才能说明你数据结构入门了。
那么,在实际开发中,我们对线性结构应该注意些什么呢?我个人的观点:
(1)数组的资源是有限的,必须确定资源的范围
(2)数组中资源的申请和释放必须一一对应,否则很容易造成资源泄漏的现象
(3)数组中的注意事项同样应用于堆分配的连续内存资源空间中
下面是自己设计的一个int分配的小程序,大家可以一起尝试一下:
a)设计内存节点的数据形式
typedef struct _DATA_NODE
{
int* pData;
char* pFlag;
int num;
}DATA_NODE; #define STATUS int
#define TRUE 1
#define FALSE 0
b)创建内存节点
DATA_NODE* malloc_node(int number)
{
DATA_NODE* pDataNode = NULL;
if(0 == number)
return NULL; pDataNode = (DATA_NODE*) malloc(sizeof(DATA_NODE));
assert(NULL != pDataNode);
memset(pDataNode, 0, sizeof(DATA_NODE)); pDataNode->pData = (int*)malloc(sizeof(int) * number);
if(NULL == pDataNode->pData){
free(pDataNode);
return NULL;
} pDataNode->pFlag = (char*) malloc( (number + 7) >> 3);
if(NULL == pDataNode->pFlag){
free(pDataNode->pData);
free(pDataNode);
return NULL;
} memset(pDataNode->pData, 0, sizeof(int) * number);
memset(pDataNode->pFlag, 0, (number + 7) >> 3);
pDataNode->num = number;
return pDataNode;
}
c) 删除内存节点
STATUS free_node(const DATA_NODE* pDataNode)
{
if(NULL == pDataNode)
return FALSE; assert(NULL != pDataNode ->pData);
assert(NULL != pDataNode-> pFlag);
assert(0 != pDataNode); free(pDataNode->pFlag);
free(pDataNode->pData);
free((void*)pDataNode);
return TRUE;
}
d)判断当前是否还有内存可以分配
int check_if_data_exist(const DATA_NODE* pDataNode)
{
int number = pDataNode->num;
char* pFlag = pDataNode->pFlag;
unsigned char flag = 0;
int loop = 1; while(loop <= number){
flag = pFlag[(loop + 7) >> 3 - 1] & (0x1 << ((loop + 7) % 8));
if(0 != flag){
return loop;
} loop ++;
} return -1;
}
e) 分配内存空间
int* alloca_data(const DATA_NODE* pDataNode)
{
int* pData = NULL;
int pos;
if(NULL == pDataNode)
return NULL; if(-1 == (pos = check_if_data_exist(pDataNode)))
return NULL; pDataNode->pFlag[(pos + 7) >> 3 - 1] |= 0x1 << ((pos + 7)% 8);
return pDataNode->pData + (pos - 1);
}
f)回收内存空间
STATUS free_data(const DATA_NODE* pDataNode, const int* pData)
{
int pos = 0;
if(NULL == pDataNode || NULL == pData)
return FALSE; if(pData < pDataNode->pData || pData > (pDataNode->pData + pDataNode->num))
return FALSE; pos = (pData - pDataNode->pData) >> 3;
pDataNode->pFlag[(pos + 7) -1] &= ~(0x1 << ((pos + 7) % 8));
return TRUE;
}
g)统计当前已经分配了多少DWORD空间
int count_free_space(const DATA_NODE* pDataNode)
{
int count = 0;
int loop = 1;
char flag = 0;
if(NULL == pDataNode)
return 0; for(; loop <= pDataNode->num; loop++)
{
flag = pDataNode->pFlag[(loop + 7) >> 3 - 1] & (0x1 << ((loop + 7) % 8));
if(0 == flag){
count ++;
}
} return count;
}
上面的代码只是一个示范,大家可以在这个基础之上加以改进,比如说:
(1)修改成可以自由分配很多内存,注意需要同时修改flag的结构类型
(2)修改成先到先得的内存分配类型
(3)修改成最合适空间的内存分配类型
(4)修改成debug类型的内存分配形式,每次分配和释放的时候都检查内存是否越界、是否没有成对运行,注意需要添加对应的判断函数
c++(线性结构的处理)的更多相关文章
- D_S 线性结构
线性结构的定义:若结构是非空有限集,则有且仅有一个开始结点和一个终端结点,并且所有结点都最多只有一个直接前驱和一个直接后继. 线性结构的特点: 只有一个首结点和尾结点 除首尾结点外,其他结点只有一个直 ...
- java数据结构--线性结构
一.数据结构 数据结构由数据和结构两部分组成,就是将数据按照一定的结构组合起来,这样不同的组合方式有不同的效率,可根据需求选择不同的结构应用在相应在场景.数据结构大致 分为两类:线性结构(如数组,链表 ...
- 线性结构与树形结构相互转换(ES6实现)
前言 当树形结构的层级越来越深时,操作某一节点会变得越来越费劲,维护成本不断增加.所以线性结构与树形的相互转换变得异常重要! 首先,我们约定树形结构如下: node = { id: number, / ...
- [Java算法分析与设计]--线性结构与顺序表(List)的实现应用
说到线性结构,我们应该立马能够在脑子里蹦出"Array数组"这个词.在Java当中,数组和对象区别基本数据类型存放在堆当中.它是一连串同类型数据存放的一个整体.通常我们定义的方式为 ...
- C#算法与数据结构之线性结构
线性结构是什么? 线性结构是一种数据结构,它有一对一的关系,就像一个长对,一个接一个,特点是,除第一个元素和最后一个元素外,其它元素前后只有一个元素. 简单示例1: static void Main( ...
- Java数据结构和算法(一)线性结构之单链表
Java数据结构和算法(一)线性结构之单链表 prev current next -------------- -------------- -------------- | value | next ...
- Java数据结构和算法(一)线性结构
Java数据结构和算法(一)线性结构 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 线性表 是一种逻辑结构,相同数据类型的 ...
- 20162327WJH第一次实验——线性结构
20162327WJH第一次实验--线性结构 实 验 报 告 实 验 报 告 课程:程序设计与数据结构 班级: 1623 姓名: 王旌含 学号:20162327 成绩: 2分 指导教师:娄嘉鹏 王志强 ...
- [PY3]——内置数据结构(9)——线性结构与切片/命名切片slice()
线性结构的总结 列表list 元组tuple 字符串str bytes bytearray的共同点: 都是顺序存储.顺序访问的: 都是可迭代对象: 都可以通过索引访问 线性结构的特征: 可迭代 ...
随机推荐
- URL加载页面的过程
总体过程: 1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面 6.连接结束 一.DNS解析 在互联网中,每一台机计算机的唯一 标识是他 ...
- /sbin/nologin 和 /bin/false 的区别
/bin/false是最严格的禁止login选项,一切服务都不能用,而/sbin/nologin只是不允许系统login,可以使用其他ftp等服务 如果想要用false在禁止login的同时允许ftp ...
- 详解PHP反射API
PHP中的反射API就像Java中的java.lang.reflect包一样.它由一系列可以分析属性.方法和类的内置类组成.它在某些方面和对象函数相似,比如get_class_vars(),但是更加灵 ...
- redis资料收集
http://www.runoob.com/redis/redis-sets.html redis set 使用 https://www.cnblogs.com/wanzaixiaoxin/p/49 ...
- 更好的小票打印体验,huanent.printer2.0发布
huanent.printer2.0是一个专注消费小票打印的类库.拥有许多先进的特性例如居中打印.自动换行等特性,可以通过简洁的代码来打印出复杂的消费小票.huanent.printer通过MIT方式 ...
- NPOI 1.2 教程
NPOI 1.2 教程官方地址 很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解. 目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 ...
- ${param.name}和${name}的区别
${param.name} == request.getParam("name") ${name} == request.getAttribute("name" ...
- 记一次Hbase查询速度优化经历
项目背景: 在这次影像系统中,我们利用大数据平台做的是文件(图片.视频等)批次的增删改查,每个批次都包含多个文件,上传完成以后要添加文件索引(文件信息及批次信息),由于在Hbase存储的过程中,每个文 ...
- Python入门-数据类型之字符串
字符串详解 没那么多废话,直接介绍字符串使用.继续往下看~~~ 字符串定义: *1.引号包围,不可变(指的是不可以对字符串进行修改)得序列(凡是能够通过索引取值的都是序列). *2.不可变对象(字符串 ...
- 机器学习小记——KNN(K近邻) ^_^ (一)
为了让绝大多数人都可以看懂,所以我就用简单的话语来讲解机器学习每一个算法 第一次写ML的博文,所以可能会有些地方出错,欢迎各位大佬提出意见或错误 祝大家开心进步每一天- 博文代码全部为python 简 ...