版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年机器学习工程师进阶考试题目
- 2026年工业自动化技术安全规范测试题
- 2026年地理基础知识测验题目
- 2026年航空模型表演合同
- 2025-2026学年湖北省黄梅县育才高级中学高一上学期1月月考英语试题
- 2025年四川建筑职业技术学院马克思主义基本原理概论期末考试模拟题附答案解析(夺冠)
- 2025年河曲县幼儿园教师招教考试备考题库附答案解析(夺冠)
- 2025年新疆科信职业技术学院单招综合素质考试题库附答案解析
- 2025年贵州开放大学马克思主义基本原理概论期末考试模拟题带答案解析(必刷)
- 2025年福州黎明职业技术学院单招职业适应性测试题库附答案解析
- 煤矿春节放假期间的工作方案及安全技术措施
- GB/T 5076-2025具有两个轴向引出端的圆柱体元件的尺寸测量
- GB/T 46568.1-2025智能仪器仪表可靠性第1部分:可靠性试验与评估方法
- 幼儿园教育活动座位摆放指南
- 水池土建施工方案
- 2025中好建造(安徽)科技有限公司第二次社会招聘13人笔试考试备考试题及答案解析
- 移动支付安全体系架构-洞察与解读
- 水泵维修安全知识培训课件
- DB43∕T 1358-2017 地质灾害治理工程质量验收规范
- 军犬的训练考试题及答案
- 临床病区药品管理试题及答案2025年版
评论
0/150
提交评论