【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

我们知道,在内存中的空间都是连续的。也就是说,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类型的内存分配形式,每次分配和释放的时候都检查内存是否越界、是否没有成对运行,注意需要添加对应的判断函数

【预告: 下面一篇博客介绍队列线性表】

一步一步写算法(之线性结构的处理)相关推荐

  1. 数据结构与算法之线性结构链表

    数据结构与算法之线性结构链表 这一篇文章主要介绍的是通过java实现单链表.循环链表和双向循环链表,仅供自己复习使用,如有什么不足之处,欢迎指出. 单链表: package xianxingjiego ...

  2. 数据结构——线性结构总结

    数据结构--线性结构总结 数据结构--线性结构总结 写在前面 线性结构的特点 线性表 栈 队列 相关的STL容器的基本操作 vector list stack queue deque 习题 线性表相关 ...

  3. 一步一步写算法(之线性队列)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 这里的线性结构实际上指的就是连续内存的意思,只不过使用"线性"这个词显得比 ...

  4. 一步一步写算法(之图结构)

    原文:一步一步写算法(之图结构) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 图是数据结构里面的重要一章.通过图,我们可以判断两个点之间是 ...

  5. 一步一步写算法(之prim算法 中)

    原文:一步一步写算法(之prim算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] C)编写最小生成树,涉及创建.挑选和添加过程 MI ...

  6. 一步一步写算法(之寻找丢失的数)

    一步一步写算法(之寻找丢失的数) 原文:一步一步写算法(之寻找丢失的数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 假设我们有一个1亿个 ...

  7. 一步一步写算法(之克鲁斯卡尔算法 中)

    一步一步写算法(之克鲁斯卡尔算法 中) 原文:一步一步写算法(之克鲁斯卡尔算法 中) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面说到 ...

  8. 一步一步写算法(之prim算法 下)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前两篇博客我们讨论了prim最小生成树的算法,熟悉了基本的流程.基本上来说,我们是按照自上而下 ...

  9. 一步一步写算法(开篇)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 算法是计算机的生命.没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值.很多 ...

最新文章

  1. Xamarin Essentials教程数据传输DataTransfer
  2. PyCharm中批量查找及替换
  3. ifcfg-eth0 配置
  4. 获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列
  5. 节点大小可变的环形队列实现
  6. numa节点_NUMA架构下的内存访问延迟区别!
  7. OCP 11G 051题库解析笔记-总
  8. 微信小程序四种父子相互传值方式
  9. Python的基本数据类型(1)
  10. 前端基础学习之Html标签
  11. 模板Template 7
  12. JavaScript 实现全选,分组全选,列表折叠。
  13. C++ 移动语义学习
  14. 【小程序源码】强大的万年历微信小程序源码下载
  15. 第一课print()输出函数(包含心形图案代码)
  16. 慢性肾炎的中医药调理【转】
  17. play框架使用起来(16)
  18. java和scala代码可以混合编写吗_Scala字符串插值的妙用,以及java+scala混合编程
  19. MT4-EA自动化交易研究笔记(2022-06-24)
  20. HTTP 、HTTPS

热门文章

  1. 安装nginx并搭建nginx图片服务器
  2. 《社交网站界面设计(原书第2版)》——3.2 注册
  3. mysql替换字段的部分数据
  4. Bzoj1034 [ZJOI2008]泡泡堂BNB
  5. linux 提高代码质量的工具
  6. 发布过程5分钟内load飙升问题排查
  7. 用WAP手机远程遥控电脑1
  8. SpringBoot集成ActiveMq消息队列实现即时和延迟处理
  9. Corn Fields——POJ3254状态压缩Dp
  10. C语言笔记(数组地址一些细节)