您的位置:首页 > 其它

使用链表管理内存

2016-07-28 10:09 197 查看
使用链表管理内存的使用,这儿重新定义了 malloc,realloc,free函数,使用了mymalloc,myrealloc,myfree自己重定义了函数

mem.h

#include<stdio.h>
#include<stdlib.h>

void * mymalloc(size_t size);
void *myrealloc(void *p, size_t size);
void myfree(void *p);

struct mem
{
void *p; //内存地址
int size; //内存大小
};

struct LinkNode
{
struct mem *pmem; //保存指针
struct LinkNode *pNext; //指向下一个节点
};

typedef struct LinkNode node, *PNODE;

struct LinkNode *phead;

PNODE addNode(PNODE phead, struct mem *pmem); //增加
PNODE changNode(PNODE phead, void *findaddr, struct mem *pmem); //修改
PNODE deleteNode(PNODE phead, void * find); //删除
void showAll(PNODE phead); //显示所节点
void getInfo(PNODE phead); //显示详细信息
PNODE deleteAll(PNODE phead); //清除所有所使用的内存
PNODE findNode(PNODE phead, void *p); //查询



mem.c
#include"eme.h"

void * mymalloc(size_t size)
{
void *p = malloc(size);
struct mem *pmem = malloc(sizeof(struct mem));
pmem->p = p;
pmem->size = size;
phead = addNode(phead, pmem);

return p;
}

void *myrealloc(void *p, size_t size)
{
void *pt = realloc(p, size);
struct mem pmem;//这儿是不需要在堆上开辟,因为只是个赋值,链表上的地址不需要修改。
pmem.p = pt;
pmem.size = size;
phead = changNode(phead, p, &pmem);
return pt;
}

void myfree(void *p)
{
PNODE ptemp = findNode(phead, p);
if (ptemp)
{
phead = deleteNode(phead, p);
free(p);
}

else
{
printf("没有内存需要释放!\n");
}
}

PNODE addNode(PNODE phead, struct mem *pmem) //增加
{
PNODE pnew = malloc(sizeof(node));
pnew->pmem = pmem;

pnew->pNext = NULL;

if (phead == NULL)
{
phead = pnew;
}
else
{
PNODE ptemp = phead;
while (ptemp->pNext != NULL)
{
ptemp = ptemp->pNext;
}
ptemp->pNext = pnew;
}
return phead;
}

PNODE changNode(PNODE phead, void *findaddr, struct mem *pmem) //修改
{
//因为修改是对原料来数据进行的改动,所以不用再分配地址
//修改要先查询一下,有没有相应的数据,如果没有则不会进行修改
PNODE ptemp = findNode(phead, findaddr);
if (ptemp == NULL)
{
printf("没有查询到要修改的地址!\n");
return phead;
}
else
{

for (PNODE ptemp = phead; ptemp != NULL;ptemp=ptemp->pNext)
{
if (ptemp->pmem->p == findaddr)
{
ptemp->pmem->p = pmem->p;
ptemp->pmem->size = pmem->size;
return phead;
}
}

}
return phead;
}

PNODE deleteNode(PNODE phead, void * find) //删除
{
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
//这儿不没有使用查询,是因为在调前(myfree())时就查询了,如果没有就直接返回
while (p1 != NULL)
{
if (p1->pmem->p == find)
{
break;
}
else
{
p2 = p1;
p1 = p1->pNext;
}
}
if (p1 == phead)
{
phead = p1->pNext;
free(p1->pmem); //释放链表所占用的内存空间
free(p1);
}
else
{
p2->pNext = p1->pNext;
free(p1->pmem); //释放链表所占用的内存空间
free(p1);
}

return phead;
}

void showAll(PNODE phead) //显示所节点
{
if (phead == NULL)
{
return;
}
else
{
PNODE ptemp = phead;
while (ptemp != NULL)
{
printf("%p %d\n", ptemp->pmem->p, ptemp->pmem->size);
ptemp = ptemp->pNext;
}
}
}

PNODE deleteAll(PNODE phead) //清除所有所使用的内存
{
if (phead == NULL)
{
return phead;
}
else
{
printf("开始清理使用的内存......\n");
PNODE p1 = NULL;
PNODE p2 = NULL;
p1 = phead;
while (p1->pNext != NULL)
{
p2 = p1->pNext;
p1->pNext = p2->pNext;
free(p2->pmem->p);
free(p2->pmem);
free(p2);
}
//删除头节点
free(phead->pmem->p);
free(phead->pmem);
free(phead);
phead = NULL;
printf("使用的内存被清空......\n");

}
return phead;
}

PNODE findNode(PNODE phead, void *p) //查询
{
for (PNODE ptemp = phead; ptemp != NULL; ptemp = ptemp->pNext)
{
if (ptemp->pmem->p == p)
{
return ptemp;
}
}

return NULL;

}
void getInfo(PNODE phead) //显示详细信息
{
int i = 0;
int j = 0;
for (PNODE ptemp = phead; ptemp != NULL; ptemp = ptemp->pNext)
{
i++;
j += ptemp->pmem->size;
}
printf("有 %d 片内存在使用中, 使用的内存地址大小为 %d k\n",i,j/1024);

}

main.c
#include"eme.h"

#define malloc mymalloc
#define realloc myrealloc
#define free myfree

void main()
{
void *p1 = malloc(10);
void *p2 = malloc(11);
void *p3 = malloc(12);
void *p4 = malloc(13);

printf("\n\n");
showAll(phead);

p1 = realloc(p1, 10000);
p2 = realloc(p2, 1000000);
printf("\n\n");
showAll(phead);

getInfo(phead);
//free(p2);
//free(p2);
//printf("\n\n");
//showAll(phead);

//free(p1);

//printf("\n\n");
//showAll(phead);

phead = deleteAll(phead);

getInfo(phead);
printf("\n\n");
showAll(phead);

system("pause");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: