#includestdio.h#definegetpch(type)(type*)malloc(sizeof(type))structLNode{intsize;intstart;intend;structLNode*next;structLNode*front;}*L;/*L为头指针*/typedefstructLNodeLN;LN*find;intn;voidInsertList(intsize,intstart){//在带头结点的单链线形表头结点后插入LN*p,*s,*t;p=L;t=p-next;s=getpch(LN);//生成新结点s-size=size;s-start=start;s-end=start+size;s-next=t;//插入L中p-next=s;if(t)t-front=s;s-front=p;}//endofInsertListvoidPrintList()/*打印*/{LN*p;inti;p=L-next;printf(\n空闲区号长度起始位置终止位置\n);for(i=1;i=n;i++){printf(%3d\t%3d\t%3d\t%4d\n,i,p-size,p-start,p-end);p=p-next;}}voidBFSortList()/*最佳适应算法的排序*/{LN*p,*s,*t;intmin_size,i;intsize,start,end;t=L-next;p=L-next;for(i=0;in;i++){s=p-next;min_size=p-size;while(s){if(min_sizes-size){min_size=s-size;t=s;}s=s-next;}size=t-size;start=t-start;end=t-end;t-size=p-size;t-start=p-start;t-end=p-end;p-size=size;p-start=start;p-end=end;t=p-next;p=p-next;}}//endofBF_SortListvoidSortList()/*首次和循环首次适应算法的排序*/{LN*p,*s,*t;intmin_start,i;intsize,start,end;t=L-next;p=L-next;for(i=0;in;i++){s=p-next;min_start=p-start;while(s){if(min_starts-start){min_start=s-start;t=s;}s=s-next;}size=t-size;start=t-start;end=t-end;t-size=p-size;t-start=p-start;t-end=p-end;p-size=size;p-start=start;p-end=end;t=p-next;p=p-next;}}//endofBF_SortListvoidGetFree()/*生成空闲分区链*/{intsize,start,i;L=getpch(LN);/*生成一个表头结点*/L-next=NULL;L-front=NULL;printf(请输入空闲区数:);scanf(%d,&n);for(i=1;i=n;i++){printf(请输入第%2d空闲区的大小和始址:,i);scanf(%3d,%3d,&size,&start);InsertList(size,start);}printf(\n按任意键继续);//printf(\n空闲链表情况:\n);//PrintList();}//endofGetFreevoidAssign(intsize)/*最佳适应算法和首次适应算法空闲分区的分配*/{LN*p,*t;p=L-next;t=L;while(p){if(sizep-size){p=p-next;t=t-next;if(!p){printf(没有足够大的空闲区分配!分配不成功);}}else{p-size=p-size-size;p-start=p-start+size;if(p-size==0){t-next=p-next;p-next-front=t;n--;free(p);}printf(分配成功!\n);printf(分配后的空闲链表情况如下:\n);PrintList();break;}}}//endofFF_Assignintflag=-1;voidNF_Assign(intsize)/*循环首次适应算法的分配*/{LN*p,*t;inti=n;p=find-next;t=find;while(p){if(sizep-size){p=p-next;t=t-next;if(!p){printf(没有足够大的空闲区分配!分配不成功);}}else{p-size=p-size-size;p-start=p-start+size;find=p;if(p-size==0){t-next=p-next;p-next-front=t;n--;free(p);}printf(分配成功!\n);flag=1;printf(分配后的空闲链表情况如下:\n);Print(L);break;}}if(flag==-1){p=L-next;t=L;while(p!=find){if(sizep-size){p=p-next;t=t-next;if(!p){printf(没有足够大的空闲区分配!分配不成功);}}else{p-size=p-size-size;p-start=p-start+size;find=t;if(p-size==0){t-next=p-next;p-next-front=t;n--;free(p);}printf(分配成功!\n);printf(分配后的空闲链表情况如下:);PrintList(L);break;}}}}//endofNF_AssignvoidRecover(intstart,intend)/*回收*/{LN*p,*t;intsize,flag=0;size=end-start;p=L-next;t=p-next;while(p){if(t&&p-end==start&&t-start==end)//回收区在两个空闲区中间{p-size=p-size+size+t-size;p-end=t-end;p-next=t-next;t-next-front=p;free(t);n--;SortList(L);flag=1;break;}elseif(p-end==start)//回收区在空闲区下方{flag=1;p-size=p-size+size;p-end=p-end+size;SortList(L);break;}elseif(p-start==end)//回收区在空闲区上方{p-size=p-size+size;p-start=start;SortList(L);flag=1;break;}p=p-next;if(p)t=p-next;}//回收区不与任何一个空闲区相邻if(flag==0){InsertList(size,start);n++;}printf(回收后的空闲链表情况如下:);PrintList();printf(\n按任意键继续);}voidmain(){intstart,end,size;intm;GetFree();getch();system(cls);/*清屏*/printf(请选择服务类型:\n);printf(\t1:首次适应算法\n);printf(\t2:循环首次适应算法\n);printf(\t3:最佳适应算法\n);printf(\t4:回收内存\n);printf(\t0:退出\n);printf(\t输入您要的选项:);scanf(%d,&m);if(m==2)find=L;while(m){switch(m){case1:SortList();printf(\n空闲链表情况:\n);PrintList();printf(请输入进程需要的空闲区大小:);scanf(%d,&size);Assign(size);printf(\n按任意键继续);break;case2:SortList();printf(\n空闲链表情况:\n);PrintList();printf(请输入进程需要的空闲区大小:);scanf(%d,&size);NF_Assign(size);printf(\n按任意键继续);break;case3:BFSortList();printf(\n空闲链表情况:\n);PrintList();printf(请输入进程需要的空闲区大小:);scanf(%d,&size);Assign(size);printf(\n按任意键继续);break;case4:printf(请输入回收区的首地址和中止地址:);scanf(%3d,%3d,&start,&end);Recover(start,end);break;case0:exit(0);default:printf(\n\t\t输入错误,请重新输入);getch();}getch();system(cls);/*清屏*/printf(请选择服务类型:\n);printf(\t1:首次适应算法\n);printf(\t2:循环首次适应算法\n);printf(\t3:最佳适应算法\n);printf(\t4:回收内存\n);printf(\t0:退出\n);printf(\t输入您要的选项:);scanf(%d,&m);}}