版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言课程设计_存储管理分区分配算法/*pcb.c*/#include stdio.h#include stdlib.h#include string.h#define MAX 32767typedef struct node /*设置分区描述器*/ int address,size; struct node *next;RECT;/*函数原型*/RECT *assignment(RECT *head,int application);void acceptment1(RECT *head,RECT *back1);void acceptment2(RECT *head,RECT *back1
2、) ;int backcheck(RECT *head,RECT *back1);void print(RECT *head);/*变量声明*/RECT *head,*back,*assign1,*p;int application1,maxblocknum;char way;/*主函数*/main() char choose10; int check; head=malloc(sizeof(RECT); /*建立可利用区表的初始状态*/ p=malloc(sizeof(RECT); head-size=MAX; head-address=0; head-next=p; maxblocknum
3、=1; p-size=MAX; p-address=0; p-next=NULL; print(head);/*输出可利用表初始状态*/ printf(Enter the way(best or first(b/f)n);/*选择适应策略*/ scanf(%c,&way); do printf(Enter the assign or accept(as/ac)n); scanf(%s,choose); /*选择分配或回收*/ if(strcmp(choose,as)=0) /*as为分配*/ printf(Input application:n); scanf(%d,&application1
4、);/*输入申请空间大小*/ assign1=assignment(head,application1);/*调用分配函数*/ if(assign1-address=-1)/*分配不成功*/ printf(Too large application!,assign fails!nn); else printf(Success!ADDRESS=%5dn,assign1-address); /*分配成功*/ print(head); /*输出*/ else if(strcmp(choose,ac)=0) /*回收*/ back=malloc(sizeof(RECT); printf(Input A
5、dress and Size!n); scanf(%d%d,&back-address,&back-size);/*输入回收地址和大小*/ check=backcheck(head,back); /*检查*/ if(check=1) if(tolower(way)=f)/*首先适应算法*/ acceptment1(head,back); /*首先适应*/ else acceptment2(head,back);/*最正确适应*/ print(head); while(!strcmp(choose,as)|!strcmp(choose,ac);/*分配函数*/RECT *assignment(R
6、ECT *head,int application) RECT *after,*before,*assign; assign=malloc(sizeof(RECT); /*分配申请空间*/ assign-size=application; assign-next=NULL; if(applicationhead-size|applicationaddress=-1; /*申请无效*/ else before=head; after=head-next; while(after-sizenext; after=after-next; if(after-size=application) /*结点
7、大小等于申请大小那么完全分配*/ 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)/*如果是最正确适应,将截取后剩余结
8、点重新回收到适宜位置*/ before-next=after-next; back=after; acceptment2(head,back); if(maxblocknum=0) /*修改最大数和头结点值*/ before=head; head-size=0; maxblocknum=1; while(before!=NULL) if(before-sizehead-size) head-size=before-size; maxblocknum=1; else if(before-size=head-size) maxblocknum+; before=before-next; assig
9、n1=assign; return assign1; /*返回分配给用户的地址*/void acceptment1(RECT *head,RECT *back1)/*首先适应*/ RECT *before,*after; int insert; before=head; after=head-next; insert=0; while(!insert) /*将回收区插入空闲区表*/ if(after=NULL)| (back1-addressaddress)& (back1-address=before-address) before-next=back1; back1-next=after;
10、 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; bac
11、k1-next=after-next; free(after); if(head-sizesize) /*修改最大块值和最大块个数*/ head-size=back1-size; maxblocknum=1; else if(head-size=back1-size) maxblocknum+;/*最正确适应,back1为回收结点的地址*/void acceptment2(RECT *head,RECT *back1) RECT *before,*after; int insert ; insert=0; before=head; after=head-next; if(head-next=N
12、ULL) /*如果可利用区表为空*/ head-size=back1-size; head-next=back1; maxblocknum+; back1-next=NULL; else while(after!=NULL) /*与上一块合并*/ if(back1-address=after-size+after-address) before-next=after-next; back-size=after-size+back1-size; free(after); after=NULL; else after=after-next; before=before-next; before=h
13、ead; after=head-next; while(after!=NULL) if(after-address=back1-size+back1-address) /*与下一块合并*/ back1-size=back1-size+after-size; before-next=after-next; free(after); after=NULL; else before=before-next; after=after-next; before=head;/*将回收结点插入到适宜的位置*/ after=head-next; do if(after=NULL|(after-sizeback
14、1-size) before-next=back1; back1-next=after; insert=1; else before=before-next; after=after-next; while(!insert); if(head-sizesize) /*修改最大块值和最大块数*/ head-size=back1-size; maxblocknum+; else if(head-size=back1-size) maxblocknum+; void print(RECT *head) /*输出链表*/ RECT *before,*after; int index,k; before
15、=head-next; index=1; if(head-next=NULL) printf(NO part for assignment!n); else printf(*index*address*end*size*n); while(before!=NULL) printf(-n); printf( %-13d%-13d%-13d%-13dn,index,before-address,before-address+before-size-1,before-size); printf(-n); index+; before=before-next; /*检查回收块的合法性,back1为要回收的结点地址*/int backcheck(RECT *head,RECT *back1) RECT *before,*after; int check=1; if(back1-addresssizenext; while(before!=NULL)&check)/*地址
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026贵州毕节大方县“特岗计划”招聘细则笔试参考题库及答案详解
- 中国储备粮管理集团有限公司2026年度夏季招聘考试模拟试题及答案详解
- 2026江苏扬州高创产业招商发展有限公司招聘10人考试参考题库及答案详解
- 2026江西赣州市龙南市第三人民医院招聘3人笔试参考试题及答案详解
- 2026上海杨浦区社区工作者招聘135人考试备考试题及答案详解
- 2026年新疆阿勒泰地区招聘中学教师(22人)考试备考题库及答案详解
- 2026贵州护理职业技术学院引进高层次人才7人考试参考题库及答案详解
- 浙江瓯海铁路投资集团有限公司面向社会公开招聘工作人员2人笔试参考题库及答案详解
- 2026-2030中国吲哚乙酸酯行业运行形势分析与经营管理风险报告
- 2026年窗帘行业分析报告及创新报告
- 100以内进位退位加减法(全)2200道题-100以内进位加减法混合
- 茶文化与茶艺(高职)全套教学课件
- 医院培训课件:《环境卫生学监测》
- 京东平台店铺运营从入门到精通
- 西药学的毕业论文
- 单句与复句区别之超详解
- 英语感叹句用法及练习题
- 不锈钢浮盘安装方案
- TD-T 1048-2016 耕作层土壤剥离利用技术规范
- 安徽涵丰科技有限公司年产6000吨磷酸酯阻燃剂DOPO、4800吨磷酸酯阻燃剂DOPO衍生品、12000吨副产品盐酸、38000吨聚合氯化铝、20000吨固化剂项目环境影响报告书
- 专家花篮拉杆悬挑脚手架专项施工方案
评论
0/150
提交评论