C语言利用链表实现有效内存管理

来源:互联网 发布:统计型定位算法模型 编辑:程序博客网 时间:2024/06/06 10:41


#include<stdio.h>#include<stdlib.h>//记录分配的内存地址大小、地址struct MEM {void *p;int size;};typedef struct LinkNode {struct MEM *pmem;//保存指针struct LinkNode *pNext;//指向下一个节点} node,*PNODE;PNODE phead;PNODE findit(PNODE phead,void *paddr) {for(PNODE p=phead; p!=NULL; p=p->pNext) {if(p->pmem->p==paddr) {return p;}}return NULL;}//删除PNODE deletenode(PNODE phead,void *paddr) {PNODE p1=NULL;PNODE p2=NULL;p1=phead;//if(phead==paddr){//如果要删除的刚好是头结点//phead=p1->pNext;//free(p1);//return phead;//}//while(p1!=paddr){//p2=p1;//p1=p1->pNext;//}//p2->pNext=p1->pNext;//free(p1);while(p1!=NULL) {if(p1->pmem->p==paddr) {break;} else {p2=p1;p1=p1->pNext;}}if(p1!=phead) {p2->pNext=p1->pNext;free(p1);} else {phead=phead->pNext;free(p1);}return phead;}void myfree(void *p) {//printf("\n内存地址%p释放\n",p);PNODE px=findit(phead,p);if(px==NULL) {return;} else {deletenode(phead,p);free(p);}}//插入数据PNODE addback(PNODE phead,struct MEM *pmem) {PNODE pnew=(PNODE)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;}void *mymalloc(size_t size) {void *p=malloc(size);//printf("\n分配内存地址%p,大小%d\n",p,size);struct MEM *pmem=(struct MEM *)malloc(sizeof(struct MEM));pmem->p=p;pmem->size=size;phead=addback(phead,pmem);return p;}//修改PNODE change(PNODE phead,void *pfind,struct MEM *pnewmem) {//PNODE pt=phead;//while(pt->pmem->p!=pfind&&pt!=NULL){//pt=pt->pNext;//}////pnewmem->p=realloc(pt,pnewmem->size);//    pt->pmem->p=pnewmem->p;//    pt->pmem->size=pnewmem->size;for(PNODE p=phead; p!=NULL; p=p->pNext) {if(p->pmem->p==pfind) {p->pmem->p=pnewmem;p->pmem->size=pnewmem->size;}}return phead;}void *myrealloc(void *p,size_t size) {void *pt=realloc(p,size);//printf("内存地址%p重新分配到%p,大小%d\n",p,pt,size);//重新完成赋值struct MEM mymem;mymem.p=pt;mymem.size=size;phead=change(phead,p,&mymem);return pt;}//显示所有数据void showall(PNODE phead) {if(phead==NULL) {return;} else {//PNODE p=phead;//    while(p!=NULL){//  printf("内存地址%p,大小%d",(p->pmem)->p,(p->pmem)->size);//    }printf("内存地址%p,大小%d\n",(phead->pmem)->p,(phead->pmem)->size);showall(phead->pNext);}}void getinfo(PNODE phead) {printf("\n\n\n");int i=0;//多少个地址int j=0;//代表多少个字节内存for(PNODE p=phead; p!=NULL; p=p->pNext) {i++;j+=p->pmem->size;printf("memaddr=%p,size=%d\n",p->pmem->p,p->pmem->size);}printf("目前一共%d个地址在使用,一共消耗%d内存\n",i,j);}//释放所有内存(双链表)void deleteall(PNODE phead) {if(phead==NULL) {return NULL;} else {PNODE p1=NULL;PNODE p2=NULL;p1=phead;while(p1->pNext!=NULL){//p2=p1;//p1=p1->pNext;//phead=p1;//保留头结点,依次往后删除 p2=p1->pNext;p1->pNext=p2->pNext;free(p2->pmem->p);//释放内存 free(p2);}//free(p1);free(phead->pmem->p); free(phead); }}#define malloc mymalloc#define free myfree#define realloc myreallocmain() {void *p1=malloc(10);void *p2=malloc(11);void *p3=malloc(12);void *p4=malloc(13);//showall(phead);getinfo(phead);//free(p1);//realloc(p2,100);free(p2);free(p2);//printf("\n\n");//showall(phead);getinfo(phead);free((void*)789320);//printf("\n\n");//showall(phead);getinfo(phead);}


0 0
原创粉丝点击