付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<stdio.h>#include<stdlib.h>#define OK 1 / 完成#define ERROR 0 / 出错typedef int Status;typedef struct free_table/定义一个空闲区说明表结构int num; 分区序号long address; 起始地址long length; / 分区大小int state; /分区状态ElemType;线性表的双向链表存储结构前趋指针后继指针typedef struct Node/ElemType data;struct Node *prior; /struct No
2、de *next; / Node,*LinkList;LinkList first; / 头结点LinkList end; / 尾结点int flag;/记录要删除的分区序号Status Initblock()/开创带头结点的内存空间链表first=(LinkList)malloc(sizeof(Node);end=(LinkList)malloc(sizeof(Node);first->prior=NULL;first->next=end;end->prior=first;end->next=NULL;end->data.num=1;end->data.a
3、ddress=40;end->data.length=600;end->data.state=0; return OK; void sort()分区序号重新排序Node *p=first->next,*q;q=p->next;for(;p!=NULL;p=p->next)for(q=p->next;q;q=q->next)if(p->data.num>=q->data.num)q->data.num+=1;/显示主存分配情况void show() int flag=0;/用来记录分区序号Node *p=first;p->d
4、ata.num=0;p->data.address=0; p->data.length=40; p->data.state=1;sort();printf("ntt»主存空间分配情况n");printf( "*nn");printf("分区序号t起始地址t分区大小t分区状态nn");while(p)printf("%dtt%dtt%d",p->data.num,p->data.address,p->data.length);if(p->data.state=0)
5、printf("tt空闲 n'n");else printf("tt p=p->next;已分配nn");printf( "*nn");/首次适应算法Status First_fit(int request)/为申请作业开辟新空间且初始化Node *p=first->next;LinkList temp=(LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p)i
6、f(p->data.state=0)&&(p->data.length=request)/有大小恰好合适的空闲块p->data.state=1;return OK;break;else if(p->data.state=0) && (p->data.length>request)/有空闲块能满足需求且有剩余temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;temp->data.num=p->data
7、.num;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.length;p->data.length-=request;p->data.num+=1;return OK;break;p=p->next;return ERROR;/最佳适应算法Status Best_fit(int request)int ch; /记录最小剩余空间Node *p=first;Node *q=NULL; 记录最佳插入位置LinkList temp=(
8、LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) /初始化最小空间和最佳位置if(p->data.state=0) && (p->data.length>=request)if(q=NULL) q=p;ch=p->data.length-request;else if(q->data.length > p->data.length)q=p;ch=p->data.lengt
9、h-request;p=p->next;if(q=NULL) return ERROR;/ 没有找到空闲块 else if(q->data.length=request) q->data.state=1;return OK; else temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.ad
10、dress+=request;q->data.length=ch;q->data.num+=1;return OK;return OK;/最差适应算法Status Worst_fit(int request)int ch; / 记录最大剩余空间Node *p=first->next;Node *q=NULL; 记录最佳插入位置LinkList temp=(LinkList)malloc(sizeof(Node);temp->data.length=request;temp->data.state=1;p->data.num=1;while(p) /初始化最大
11、空间和最佳位置if(p->data.state=0 && (p->data.length>=request) if(q=NULL) q=p;ch=p->data.length-request; else if(q->data.length < p->data.length) q=p;ch=p->data.length-request; p=p->next;if(q=NULL) return ERROR;/没有找到空闲块else if(q->data.length=request) q->data.length=1
12、;return OK; else temp->prior=q->prior;temp->next=q;temp->data.address=q->data.address;temp->data.num=q->data.num;q->prior->next=temp;q->prior=temp;q->data.address+=request;q->data.length=ch;q->data.num+=1;return OK; return OK;/分配主存Status allocation(int a)int re
13、quest;/ 申请内存大小printf("请输入申请分配的主存大小(单位:KB):");scanf("%d",&request);if(request<0 |request=0)printf("分配大小不合适,请重试!");return ERROR;switch(a)case 1: /默认首次适应算法if(First_fit(request)=OK) printf("t*else printf("t*内存不足,分配失败!return OK;break;case 2: 选择最佳适应算法if(Best_
14、fit(request)=OK) printf("t*else printf("t*内存不足,分配失败!return OK;break;case 3: /选择最差适应算法if(Worst_fit(request)=OK) printf("t*else printf("t*内存不足,分配失败!return OK;break;分配成功!*");*");分配成功! *");* 分配成功!*");* Status deal1(Node *p)/ 处理回收空间 Node *q=first;for(;q!=NULL;q=q-&
15、gt;next) if(q=p) if(q->prior->data.state=0&&q->next->data.state!=0) q->prior->data.length+=q->data.length; q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;if(q->prior->data.state!=0&&q-
16、>next->data.state=0) q->data.length+=q->next->data.length;q->next=q->next->next;q->next->next->prior=q;q->data.state=0;q->data.num=flag;)if(q->prior->data.state=0&&q->next->data.state=0)q->prior->data.length+=q->data.length;q->pr
17、ior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1;)if(q->prior->data.state!=0&&q->next->data.state!=0)q->data.state=0;)return OK;)Status deal2(Node *p)/ 处理回收空间Node *q=first;for(;q!=NULL;q=q->next)if(q=p)if(q->
18、prior->data.state=0&&q->next->data.state!=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=p->prior;q->data.state=0;q->data.num=flag-1;)if(q->prior->data.state!=0&&q->next->data.state=0)q
19、->data.state=0;)if(q->prior->data.state=0&&q->next->data.state=0)q->prior->data.length+=q->data.length;q->prior->next=q->next;q->next->prior=q->prior;q=q->prior;q->data.state=0;q->data.num=flag-1; if(q->prior->data.state!=0&&q-
20、>next->data.state!=0)q->data.state=0; return OK;/主存回收Status recovery(int flag) Node *p=first;for(;p!=NULL;p=p->next) if(p->data.num=flag)if(p->prior=first)if(p->next!=end)/ 当前P指向的下一个不是最后一个时 if(p->next->data.state=0) /与后面的空闲块相连p->data.length+=p->next->data.length;p
21、->next->next->prior=p;p->next=p->next->next;p->data.state=0;p->data.num=flag; else p->data.state=0;if(p->next=end)/ 当前P指向的下一个是最后一个时 p->data.state=0; / 结束 if(p->prior=block_first) 的情况else if(p->prior!=first)if(p->next!=end)deal1(p);elsedeal2(p);/ 结束 if(p->
22、prior!=block_first)的情况/ 结束 if(p->data.num=flag) 的情况printf("t* return OK;/主函数void main()int i; /回收成功*");操作选择标记算法选择标记printf("*printf("ttprintf("t(1)用以下三种方法实现主存空间的分配*n");n");首次适应算法t(2)最佳适应算法t(3)最差适应算法n");printf("*n");printf("n");printf(&quo
23、t;请输入所使用的内存分配算法:");scanf("%d",&a);while(a<1|a>3)printf("输入错误,请重新输入所使用的内存分配算法:n");scanf("%d",&a);switch(a)case 1:printf("nt*case 2:printf("nt* case 3:printf("nt*Initblock(); while(1) show();,*,*开创空间表使用首次适应算法:使用最佳适应算法:使用最坏适应算法:*n");b
24、reak;*n");break;*n");break;int a;/printf("t1:分配内存t2: 回收内存t0: 退出n");printf("请输入您的操作:");scanf("%d",&i);if(i=1) allocation(a); /else if(i=2) /printf("分配内存 内存回收请输入您要释放的分区号:");scanf("%d",&flag); recovery(flag);else if(i=0)printf("n
25、退出程序 n");break; 退出else /printf("continue;输入操作有误输入有误,请重试!”);执行结果和结果分析初始化首次适应算法:睛输入所使用的内存分配算法ri*使用首次适应算法:*«主存空间分配情况分区序号起始地址分区大小分区状态a040已分配140600空闲0 :退出当作业1、2、3顺利分配内存空间后:1;方那内存2:回收内存的操信1清分配的主任大小单位工KBf酶 配成功! *至存空间分配情况XKXMEKNMEJtKMEmaiEm 魏 X<aiEmaX<M:J<<>EX<>E<J<W:X3<>EXa<3*X3<>tX3XiWiM 箕:MXatXXJE分区序号起始地址分区大小分区状态R040已分配140130已分配217060已分配3230100已分配433U310空闲XKMMEKXMEXMMEXXMEXMMEXMXMXXKXXJOEXXaCXXXXXatXXJEXiMaCXiMitNiMJfXWXiMJfXiMJE回收序号2里面的内存:1:分配内存2=回收内存麟I舞iU、区号.20:退出王存空间分配情况M:MXM:KX>C:MKl>EX>C>EKlE>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年企业研发中心创新能力提升方案
- 2026年文化产业园运营模式研究
- 2026年初中历史中考模拟专项训练
- 酒店布草洗涤合同(范本)
- 销售合同模板(范本)
- 六年级下册数学北师大含答案 圆锥的体积
- 四年级下册数学北师大含答案 数学好玩2奥运中的数学
- 工会业务考试题目及详细答案
- 2026年储能助力“双碳”目标实现路径
- 河科大机械零件教案第15章 轴
- 新能源客车安全培训课件
- GB/T 43683.3-2025水轮发电机组安装程序与公差导则第3部分:立式混流式水轮机或水泵水轮机
- 2025一级消防工程师继续教育题库及答案
- 2025-2030中国拍立得行业发展状况与未来前景预测分析报告
- 电工四级练习题库(含参考答案)
- 牛结节病的症状和治疗方法
- 企业违反纪律检讨书范文(8篇)
- 《非遗手工技艺(拓印)》课件-第一章 拓片的由来和历史
- 工程量清单及招标控制价编制服务采购实施方案
- (高清版)JTGT 5440-2018 公路隧道加固技术规范
- (正式版)QBT 2821-2024 金属晾衣架
评论
0/150
提交评论