设为首页 加入收藏

TOP

一步一步写算法(之线性结构的处理)(一)
2014-11-23 23:33:49 来源: 作者: 【 】 浏览:12
Tags:步一步 算法 线性 结构 处理

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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

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;

}

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;

}

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[(

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇 C程序存储布局 下一篇[C库函数]strcat实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: