本文共 2313 字,大约阅读时间需要 7 分钟。
把内容过程中比较好的一些内容段做个珍藏,下边内容是关于C++算法之线性结构处理的内容。
typedef struct _DATA_NODE { int num; }DATA_NODE; #define STATUS int #define TRUE 1 #define FALSE 0
b)创建内存节点
{ if(0 == number) return NULL; assert(NULL != pDataNode); memset(pDataNode, 0, sizeof(DATA_NODE)); if(NULL == pDataNode->pData){ free(pDataNode); return NULL; } if(NULL == pDataNode->pFlag){ free(pDataNode->pData); free(pDataNode); return NULL; } memset(pDataNode->pFlag, 0, (number + 7) >> 3); pDataNode->num = number; return pDataNode; }
c)删除内存节点
{ if(NULL == pDataNode) return FALSE; assert(NULL != pDataNode ->pData); assert(NULL != pDataNode-> pFlag); assert(0 != pDataNode); free(pDataNode->pFlag); free(pDataNode->pData); return TRUE; }
d)判断当前是否还有内存可以分配
{ int number = pDataNode->num; 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 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)回收内存空间
{ 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 = 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类型的内存分配形式,每次分配和释放的时候都检查内存是否越界、是否没有成对运行,注意需要添加对应的判断函数
转载于:https://blog.51cto.com/14142860/2333704