循环首次适应算法、首次适应算法、最佳适应算法-C语言版.doc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 循环 首次 适应 算法 最佳 语言版
- 资源描述:
-
#include<stdio.h> #define getpch(type) (type*)malloc(sizeof(type)) struct LNode { int size; int start; int end; struct LNode *next; struct LNode *front; }*L; /*L为头指针*/ typedef struct LNode LN; LN *find; int n; void InsertList(int size,int start) { // 在带头结点的单链线形表头结点后插入 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; }//end of InsertList void PrintList() /*打印*/ { LN *p; int i; 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; } } 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=p->next; p=p->next; } }// end of BF_SortList 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=p->next; p=p->next; } }// end of BF_SortList 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空闲区的大小和始址:",i); scanf("%3d,%3d",&size,&start); InsertList(size,start); } printf("\n按任意键继续"); //printf("\n空闲链表情况:\n"); //PrintList(); }// end of GetFree void Assign(int size) /*最佳适应算法和首次适应算法空闲分区的分配*/ { LN *p,*t; p=L->next; t=L; 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 ; if(p->size==0) { t->next = p->next ; p->next->front=t; n--; free(p); } printf("分配成功!\n"); printf("分配后的空闲链表情况如下:\n"); PrintList(); break; } } }// end of FF_Assign 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->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; } } } }// end of NF_Assign 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("\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) { 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("\t2:循环首次适应算法\n"); printf("\t3:最佳适应算法\n"); printf("\t4:回收内存\n"); printf("\t0:退出\n"); printf("\t输入您要的选项:"); scanf("%d",&m); } }展开阅读全文

咨信网声明:本文档由用户上传并分享,仅供学习交流、研究之用,未经授权,严禁复制、发行、汇编、翻译或网络传播等,侵权必究。
咨信网小贴示:
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】
1、浏览或下载可查看了解,请点击【咨信网告知】。
2、下载文件中如有侵权或不适当内容,将立即纠正。
3、如果因为网速或其他原因下载失败请重新下载,重复下载[60天内]不扣币。
4、开具发票登录电脑端申请,请点击【索取发票】。
咨信网客服组:【微信客服】


循环首次适应算法、首次适应算法、最佳适应算法-C语言版.doc
















自信AI助手














微信客服
客服QQ
发送邮件
意见反馈



链接地址:https://www.zixin.com.cn/doc/10820102.html