#include #include char memory[20]; typedef struct node{ char processName; int addr; int size; struct node* next; }Node;//建立链表表示已分配节点和自由节点 Node *fre,*used;//已分配节点和自由节点头指针 void init(){//初始化 int i=0; for(;i<20;i++) memory[i]='-'; //内存初始化 fre=(Node*)malloc(sizeof(Node));//自由链表初始化 fre->addr=0; fre->processName='-'; fre->size=20; fre->next='\0'; used='\0'; //已分配内存链表初始化 } void showMemory(){ //显示内存 int i=0;Node*p; for(;i<20;i++) printf("%c",memory[i]); printf("\n自由链表:"); p=fre; while(p){ printf("起始地址%d,大小%d=>",p->addr,p->size); p=p->next; } printf("\n使用链表:"); p=used; while(p){ printf("进程名:%c,起始地址:%d,大小:%d=>",p->processName,p->addr,p->size); p=p->next; } printf("\n"); } void allocMemory(char processName,int begin,int size){ int i; for(i=begin;isize>size){ allocMemory(processName,p->addr,size); p->size-=size;//分配内存 p->addr+=size; q=(Node*)malloc(sizeof(Node)); q->addr=p->addr-size;q->processName=processName; q->size=size; q->next=used; used=q; break; }if(p->size==size){ if(pre==0){ fre=p->next; }else{ pre->next=p->next; } allocMemory(processName,p->addr,size); p->processName=processName; p->next=used; used=p; return; }else{ pre=p; p=p->next; } if(!p) printf("进程%c申请内存失败\n",processName); } } void hsMemory(Node *node){//回收内存 } void endProcess(char processName){//结束进程,归还内存资源 } int main() { init();//内存总量20个单位 showMemory(); applyMemory('A',5); showMemory(); applyMemory('B',6); showMemory(); applyMemory('C',6); showMemory(); applyMemory('D',3); showMemory(); endProcess('B'); showMemory(); endProcess('C'); showMemory(); endProcess('A'); showMemory(); endProcess('A'); showMemory(); return 0; } 结果: -------------------- 自由链表:起始地址0,大小20=> 使用链表: AAAAA--------------- 自由链表:起始地址5,大小15=> 使用链表:进程名:A,起始地址:0,大小:5=> AAAAABBBBBB--------- 自由链表:起始地址11,大小9=> 使用链表:进程名:B,起始地址:5,大小:6=>进程名:A,起始地址:0,大小:5=> AAAAABBBBBBCCCCCC--- 自由链表:起始地址17,大小3=> 使用链表:进程名:C,起始地址:11,大小:6=>进程名:B,起始地址:5,大小:6=>进程名:A,起始地址:0,大小:5=> AAAAABBBBBBCCCCCCDDD 自由链表: 使用链表:进程名:D,起始地址:17,大小:3=>进程名:C,起始地址:11,大小:6=>进程名:B,起始地址:5,大小:6=>进程名:A,起始地址:0,大小:5=> AAAAA------CCCCCCDDD 自由链表:起始地址5,大小6=> 使用链表:进程名:D,起始地址:17,大小:3=>进程名:C,起始地址:11,大小:6=>进程名:A,起始地址:0,大小:5=> AAAAA------------DDD 自由链表:起始地址5,大小12=> 使用链表:进程名:D,起始地址:17,大小:3=>进程名:A,起始地址:0,大小:5=> -----------------DDD 自由链表:起始地址0,大小17=> 使用链表:进程名:D,起始地址:17,大小:3=> 内存中无此进程 -----------------DDD 自由链表:起始地址0,大小17=> 使用链表:进程名:D,起始地址:17,大小:3=>