版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5年级下册第26课教学课件教学
- 人教版九年级化学第二单元我们周围的空气实验活动1氧气的实验室制取与性质课件
- 2024年度钢管市场调查与竞争对手分析承包合同
- 技术授权合同范本 2篇
- 小学一年级家长培训
- 淋巴瘤主要护理问题
- 《物料管理》课件
- 2024年度技术服务合同:云计算服务的提供与维护3篇
- 仁爱版七年级上册英语全册教案(供参考)
- 2024版医疗信息技术服务合同
- 审计专业职业生涯规划总结报告
- 水稻碳足迹评价技术指南
- 工会跳棋活动方案
- 新高考英语读后续写技巧与训练:助人类20篇
- 规范开展学术活动管理制度
- 建设工程监理职业生涯规划
- 冻酸奶市场洞察报告
- 胎儿肛门闭锁个案护理
- 成都YC公司创业计划书
- 2022年全国统一高考化学试卷和答案解析(全国甲卷)
- 企业退税申请报告范文
评论
0/150
提交评论