C语言课程设计_存储管理分区分配算法/***pcb.c***/#include"stdio.h"#include"stdlib.h"#include"string.h"#defineMAX32767typedefstructnode/*设置分区描述器*/{intaddress,size;structnode*next;}RECT;/*函数原型*/RECT*assignment(RECT*head,intapplication);voidacceptment1(RECT*head,RECT*back1);voidacceptment2(RECT*head,RECT*back1);intbackcheck(RECT*head,RECT*back1);voidprint(RECT*head);/*变量声明*/RECT*head,*back,*assign1,*p;intapplication1,maxblocknum;charway;/*主函数*/main(){charchoose[10];intcheck;head=malloc(sizeof(RECT));/*建立可利用区表的初始状态*/p=malloc(sizeof(RECT));head->size=MAX;head->address=0;head->next=p;maxblocknum=1;p->size=MAX;p->address=0;p->next=NULL;print(head);/*输出可利用表初始状态*/printf("Entertheway(bestorfirst(b/f)\n");/*选择适应策略*/scanf("%c",&way);do{printf("Entertheassignoraccept(as/ac)\n");scanf("%s",choose);/*选择分配或回收*/if(strcmp(choose,"as")==0)/*as为分配*/{printf("Inputapplication:\n");scanf("%d",&application1);/*输入申请空间大小*/assign1=assignment(head,application1);/*调用分配函数*/if(assign1->address==-1)/*分配不成功*/printf("Toolargeapplication!,assignfails!!\n\n");elseprintf("Success!!ADDRESS=%5d\n",assign1->address);/*分配成功*/print(head);/*输出*/}elseif(strcmp(choose,"ac")==0)/*回收*/{back=malloc(sizeof(RECT));printf("InputAdressandSize!!\n");scanf("%d%d",&back->address,&back->size);/*输入回收地址和大小*/check=backcheck(head,back);/*检查*/if(check==1){if(tolower(way)=='f')/*首先适应算法*/acceptment1(head,back);/*首先适应*/elseacceptment2(head,back);/*最佳适应*/print(head);}}}while(!strcmp(choose,"as")||!strcmp(choose,"ac"));}/*分配函数*/RECT*assignment(RECT*head,intapplication){RECT*after,*before,*assign;assign=malloc(sizeof(RECT));/*分配申请空间*/assign->size=application;assign->next=NULL;if(application>head->size||application<=0)assign->address=-1;/*申请无效*/else{before=head;after=head->next;while(after->size
next;after=after->next;}if(after->size==application)/*结点大小等于申请大小则完全分配*/{if(after->size==head->size)maxblocknum--;before->next=after->next;assign->address=after->address;free(after);}else{if(after->size==head->size)maxblocknum--;after->size=after->size-application;/*大于申请空间则截取相应大小分配*/assign->address=after->address+after->size;if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/{before->next=after->next;back=after;acceptment2(head,back);}}if(maxblocknum==0)/*修改最大数和头结点值*/{before=head;head->size=0;maxblocknum=1;while(before!=NULL){if(before->size>head->size){head->size=before->size;maxblocknum=1;}elseif(before->size==head->size)maxblocknum++;before=before->next;}}}assign1=assign;returnassign1;/*返回分配给用户的地址*/}voidacceptment1(RECT*head,RECT*back1)/*首先适应*/{RECT*before,*after;intinsert;before=head;after=head->next;insert=0;while(!insert)/*将回收区插入空闲区表*/{if((after==NULL)||((back1->address<=after->address)&&(back1->address>=before->address))){before->next=back1;back1->next=after;insert=1;}else{before=before->next;after=after->next;}}if(back1->address==before->address+before->size)/*与上一块合并*/{before->size=before->size+back1->size;before->next=back1->next;free(back1);back1=before;}if(after!=NULL&&(after->address==back1->address+back1->size)){/*与下一块合并*/back1->size=back1->size+after->size;back1->next=aft...