版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 acc
2、eptment1(RECT *head,RECT *back1);void acceptment2(RECT *head,RECT *back1) ;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(s
3、izeof(RECT); /*建立可利用区表的初始状态*/ p=malloc(sizeof(RECT); head->size=MAX; head->address=0; head->next=p; maxblocknum=1; p->size=MAX; p->address=0; p->next=NULL; print(head);
4、 /*输出可利用表初始状态*/ 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); /*选择分配或
5、回收*/ if(strcmp(choose,"as")=0) /*as为分配*/ printf("Input application:n"); scanf("%d",&application1);/*输入申请空间大小*/
6、60; assign1=assignment(head,application1);/*调用分配函数*/ if(assign1->address=-1)/*分配不成功*/ printf("Too large application!,assign fails!nn"); else &
7、#160; printf("Success!ADDRESS=%5dn",assign1->address); /*分配成功*/ print(head); /*输出*/ else if(strcmp(choose,"ac")=0) /*回
8、收*/ back=malloc(sizeof(RECT); printf("Input Adress and Size!n"); scanf("%d%d",&back-
9、>address,&back->size);/*输入回收地址和大小*/ check=backcheck(head,back); /*检查*/ if(check=1)
10、160; if(tolower(way)='f')/*首先适应算法*/ acceptment1(head,back); /*首先适应*/ else
11、 acceptment2(head,back);/*最正确适应*/ print(head); while(!strcmp(choose,"as")|!strcmp(choose,"ac");/*分配函数*/RECT
12、*assignment(RECT *head,int application) RECT *after,*before,*assign; assign=malloc(sizeof(RECT); /*分配申请空间*/ assign->size=application; assign->next=NULL; if(application>head->size|application<=0) assig
13、n->address=-1; /*申请无效*/ else before=head; after=head->next; while(after->size<application)/*查找适应的结点*/ before=before->next
14、; after=after->next; if(after->size=application) /*结点大小等于申请大小那么完全分配*/ if(after->size=head->size)
15、 maxblocknum-; before->next=after->next; assign->address=after->address; free(after); else &
16、#160; if(after->size=head->size) maxblocknum-; after->size=after->size-application; /*大于申请空间那么截取相应大小分配*/ assign->address=after->address+after->size;
17、0; if(tolower(way)='b')/*如果是最正确适应,将截取后剩余结点重新回收到适宜位置*/ before->next=after->next; back=after;
18、160; acceptment2(head,back); if(maxblocknum=0) /*修改最大数和头结点值*/ before=head; head->size=0;
19、; maxblocknum=1; while(before!=NULL) if(before->size>head->size)
20、160; head->size=before->size; maxblocknum=1; else
21、 if(before->size=head->size) maxblocknum+; before=before->next;
22、0; assign1=assign; return assign1; /*返回分配给用户的地址*/void acceptment1(RECT *head,RECT *back1)/*首先适应*/ RECT *before,*after; int insert; before=head; after=head->next; insert=0; while(!insert) /*将回收区插
23、入空闲区表*/ if(after=NULL)| (back1->address<=after->address)&& (back1->address>=before->address)
24、0; before->next=back1; back1->next=after; insert=1; else before=before->next;
25、0; after=after->next; if(back1->address=before->address+before->size)/*与上一块合并*/ before->size=before->size+back1->size; before->next=back1->n
26、ext; free(back1); back1=before; if(after!=NULL&&(after->address=back1->address+back1->size) /*与下一块合并*/ back1->size=back1->size+after->size;
27、0; back1->next=after->next; free(after); if(head->size<back1->size) /*修改最大块值和最大块个数*/ head->size=back1->size; maxblocknum=1; else&
28、#160; if(head->size=back1->size) maxblocknum+;/*最正确适应,back1为回收结点的地址*/void acceptment2(RECT *head,RECT *back1) RECT *before,*after; int insert ; insert=0; before=head; after=head
29、->next; if(head->next=NULL) /*如果可利用区表为空*/ head->size=back1->size; head->next=back1; maxblocknum+; back1->next=NULL; else
30、; while(after!=NULL) /*与上一块合并*/ if(back1->address=after->size+after->address) before->next=after->next; back->size=after->size+
31、back1->size; free(after); after=NULL; else after=after->next; bef
32、ore=before->next; before=head; after=head->next; while(after!=NULL) if(after->address=back1->size+back1->address) /*与下一块合并*/
33、160; back1->size=back1->size+after->size; before->next=after->next; free(after); after=NULL; el
34、se before=before->next; after=after->next; before=head;/*将回收结点插入到适宜的位置*/ after=head->next;
35、60;do if(after=NULL|(after->size>back1->size) before->next=back1; back1->next=after;
36、160; insert=1; else before=before->next; after=after-&
37、gt;next; while(!insert); if(head->size<back1->size) /*修改最大块值和最大块数*/ head->size=back1->size; ma
38、xblocknum+; else if(head->size=back1->size) maxblocknum+; void print(RECT *head) /*输出链表*/ RECT *before,*after; int ind
39、ex,k; before=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"); pr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微创三叉神经微血管减压术的术后早期活动指导
- 影像学评分系统对职业性哮喘的严重度评估
- 康复辅助技术适配的培养策略创新优化
- 康复机器人与传统康复疗法的联合疗效对比
- 序贯免疫联合治疗在AEGC中的策略优化
- 干细胞治疗长期评估方法
- 小儿丹毒课件
- 干细胞多能性鉴定的质控体系优化策略
- 帕金森病非运动症状改善
- 寝室消防用电安全培训内容课件
- 消防电气安全培训资料课件
- 燃气管道标志桩设置规范
- 2025低空经济驱动因素、主要产品、产业链条及相关上市公司分析报告
- 手足综合征护理要点
- 2025贵州六盘水市盘州市教育系统考调教师48人备考试题及答案解析
- 益生菌医学科普知识培训课件
- 六年级上册数学《单位1》专项训练
- CT增强检查适应症课件
- 医院运营成本管理体系
- 中国无人机用光电吊舱行业市场前景预测及投资价值评估分析报告
- 2025年哈尔滨铁道职业技术学院单招笔试综合素质试题库含答案解析(5套共100道单选合辑)
评论
0/150
提交评论