循环首次适应算法、首次适应算法、最佳适应算法_C语言版

来源:互联网 发布:北京哪里体检最好 知乎 编辑:程序博客网 时间:2024/05/16 09:03
#include <stdio.h>#define getpch(type) (type*)mallloc(sizeof(type))strct LNode{int size;int start;int end;struct LNode *next;struct LNode *front;}*L;typedeft struct LNode LN;LN *find;int n;void InsertList(int size,int start){LN *p,*s,*t;p=L;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;}}void BFSortList(){LN *p,*s,*t;int min_size,i;int size,start,end;t=L->next;p=L->next;for(i=0;i<n;i++){s=p->next;min_size=p->size;while(s){if(min_size>s->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=->next;p=p->next;}}void SortList(){LN *p.*s,*t;int min_start,i;int size,start,end;t=L->next;p=L->next;for(i=0;i<n;i++){s=p->next;min_start=p->start;while(s){if(min_start>s->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=->next;p=p->next;}}void GetFree(){int size,start,i;L=getpch(LN);L->next=NULL;L->front=NULL;printf("请输入空闲区数:");scanf("%d",&n);for(i=1;i<=n;i++){printf("请输入第%2d空闲区的大小和初始地址。\n",i);scanf("%3d,%3d",&size,&start);InsertList(size,start);}printf("\n按任意键继续。");}void Assign(int size){LN *p,*t;p=L->next;t=L;while(p){p=p->next;t=t->next;if(!p){printf("没有足够大的空间。\n");}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;}}int flag=-1;void NF_Assign(int size){LN *P,*t;int i=n;p=find->next;t=find;while(p){if(size>p->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(size>p->size){p=p->size;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("分配后的空闲链表情况如下:\n");PrintList(L);break;}}}}void Recover(int start,int end){LN *p,*t;int size,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;}else if(p->end==start){flag=1;p->size=p->size+size;p->end=p->end+size;SortList(L);break;}else if(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按任意间继续。");}void main(){int start,end,size;int m;GetFree();getch();system("cls");printf("请选择服务类型:\n");printf("\t1:首次适应算法\n");printf("\t3:最佳适应算法\n");printf("\t4:最佳适应算法\n");printf("\t0:退出\n");printf("\t输入您要的选项:\n");scanf("%d",&m);if(m==2)find=L;while(m){switch(m){case 1:SortList();printf("\n空闲链表情况:\n");PrintList();printf("请输入进程需要的空闲区大小:");scanf("%d",&size);Assign(size);printf("\n按任意键继续");break;case 2:SortList();printf("\n空闲链表情况:\n");PrintList();printf("请输入进程需要的空闲区大小:");scanf("%d",&size);NF_Assign(size);printf("\n按任意键继续");break;case 3:BFSortList();printf("\n空闲链表情况:\n");PrintList();printf("请输入进程需要的空闲区大小:");scanf("%d",&size);Assign(size);printf("\n按任意键继续");break;case 4:printf("请输入回收去的首地址和中止地址:");scanf("%3d,%3d",&start,&end);Recover(start,end);break;case 0: exit(0);default:printf("\n\t\t输入错误,请重新输入");getch();}getch();system("cls");printf("请选择服务类型:\n");printf("\t1:首次适应算法\n");printf("\t3:最佳适应算法\n");printf("\t4:最佳适应算法\n");printf("\t0:退出\n");printf("\t输入您要的选项:\n");scanf("%d",&m);}}

0 0