数据结构课程设计内存分配Word文档格式.docx
《数据结构课程设计内存分配Word文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计内存分配Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
stdlib.h"
string.h"
#defineMAX32767
typedefstructnode/*设置分区描述器*/
{
intaddress,size;
structnode*next;
}RECT;
/*函数原型*/
RECT*assignment(RECT*head,intapplication);
voidacceptment1(RECT*head,RECT*back1);
voidacceptment2(RECT*head,RECT*back1)
intbackcheck(RECT*head,RECT*back1);
voidprint(RECT*head);
/*变量声明*/
RECT*head,*back,*assign1,*p;
intapplication1,maxblocknum;
charway;
/*主函数*/
main()
charchoose[10];
intcheck;
head=malloc(sizeof(RECT));
/*建立可利用区表的初始状态*/
p=malloc(sizeof(RECT));
head->
size=MAX;
address=0;
next=p;
maxblocknum=1;
p->
next=NULL;
print(head);
/*输出可利用表初始状态*/
printf("
Entertheway(bestorfirst(b/f)\n"
);
/*选择适应策略*/
scanf("
%c"
&
way);
do{
Entertheassignoraccept(as/ac)\n"
%s"
choose);
/*选择分配或回收*/
if(strcmp(choose,"
as"
)==0)/*as为分配*/
{
Inputapplication:
\n"
%d"
application1);
/*输入申请空间大小*/
assign1=assignment(head,application1);
/*调用分配函数*/
if(assign1->
address==-1)/*分配不成功*/
Toolargeapplication!
assignfails!
!
\n\n"
else
Success!
ADDRESS=%5d\n"
assign1->
address);
/*分配成功*/
/*输出*/
}
elseif(strcmp(choose,"
ac"
)==0)/*回收*/
back=malloc(sizeof(RECT));
InputAdressandSize!
%d%d"
back->
address,&
size);
/*输入回收地址和大小*/
check=backcheck(head,back);
/*检查*/
if(check==1)
if(tolower(way)=='
f'
)/*首先适应算法*/
acceptment1(head,back);
/*首先适应*/
acceptment2(head,back);
/*最佳适应*/
}while(!
strcmp(choose,"
)||!
));
}
/*
分配函数
*/
RECT*assignment(RECT*head,intapplication)
RECT*after,*before,*assign;
assign=malloc(sizeof(RECT));
/*分配申请空间*/
assign->
size=application;
if(application>
head->
size||application<
=0)
address=-1;
/*申请无效*/
before=head;
after=head->
next;
while(after->
size<
application)/*查找适应的结点*/
before=before->
after=after->
if(after->
size==application)/*结点大小等于申请大小则完全分配*/
size==head->
size)
maxblocknum--;
before->
next=after->
address=after->
address;
free(after);
size)maxblocknum--;
after->
size=after->
size-application;
/*大于申请空间则截取相应大小分配*/
address+after->
size;
b'
)/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/
back=after;
if(maxblocknum==0)/*修改最大数和头结点值*/
size=0;
while(before!
=NULL)
if(before->
size>
size=before->
elseif(before->
maxblocknum++;
assign1=assign;
returnassign1;
/*返回分配给用户的地址*/
voidacceptment1(RECT*head,RECT*back1)/*首先适应*/
RECT*before,*after;
intinsert;
insert=0;
while(!
insert)/*将回收区插入空闲区表*/
if((after==NULL)||((back1->
address<
=after->
address)&
&
(back1->
address>
=before->
address)))
next=back1;
back1->
next=after;
insert=1;
if(back1->
address==before->
address+before->
size)/*与上一块合并*/
size+back1->
next=back1->
free(back1);
back1=before;
if(after!
=NULL&
(after->
address==back1->
address+back1->
size))
{/*与下一块合并*/
size=back1->
size+after->
if(head->
back1->
size)/*修改最大块值和最大块个数*/
size==back1->
/*最佳适应,back1为回收结点的地址*/
RECT*before,*after;
intinsert
next==NULL)/*如果可利用区表为空*/
while(after!
=NULL)/*与上一块合并*/
if(back1->
address==after->
address)
back->
after=NULL;
address)/*与下一块合并*/
before=head;
/*将回收结点插入到合适的位置*/
after=head->
do{
if(after==NULL||(after->
insert);
size)/*修改最大块值和最大块数*/
voidprint(RECT*head)/*输出链表*/
intindex,k;
before=head->
index=1;
next==NULL)
NOpartforassignment!
*****index*******address********end*********size*****\n"
----------------------------------------------------\n"
%-13d%-13d%-13d%-13d\n"
index,before->
address,before->
size-1,before->
index++;
}/*检查回收块的合法性,back1为要回收的结点地址*/
intbackcheck(RECT*head,RECT*back1)
intcheck=1;
0||back1->
0)
check=0;
/*地址和大小不能为负*/
while((before!
=NULL)&
check)/*地址不能和空闲区表中结点出现重叠*/
if(((back1->
before->
address)&
address))||((back1->
address)
&
size)))
if(check==0)
Errorinput!
returncheck;
/*返回检查结果*/
}
四.运行与测试
可以自己手动写入需要的相应文本内容,也可以系统自动生成
系统自动生成文本前或是手动建立文本前,选择1便会出错
现在我们选择2重新输入文本内容并选择输入4自由块空间,每个空间起始地址与长度自己定义,输入完选择3显示空闲表和分配表
返回选择界面,选择1申请空间
申请完毕选择3可看分配情况跟此时自由块的空闲和占用情况
完成作业后撤销作业
撤销完毕后再来查看此时自由块情况,会发现作业空间释放后自由块恢复原本大小
五、总结
在这次课设中,我发现自己c语言掌握的不够好,但是这次课设使我对操作系统的知识有了一定的了解,也巩固了c语言的知识,设计中,对程序代码的设计阶段比较困难,但是我觉得通过课设能提高我的动手能力与熟练程度。
参考文献
《数据结构》(C语言版)严蔚敏、吴伟民编著
[美]S巴斯.计算机算法:
《设计和分析引论》.朱洪等译
《数据库系统基础》姚诗斌编著