1、然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。 (四)输出 要求每执行一次,输出一次空闲区队列情况,内容包括: 编号 首址 终址 大小 2.主要流程和源代码实验二源代码#includestdlib.hstring.h#define MAX_SIZE 32767typedef struct node int id; int adr;int size; struct node *next; Node;Node *head1,*head2,*back1,*back2,*assign;int request;int check(in
2、t add,int siz,char c) Node *p,*head;int check=1;if(add0|siznext;while(p!=NULL)&check) if(addadr)&(add+sizadr)|(add=p-(addsize) check=0; else p=p-if(check=0) printf(t输入释放区地址或大小有错误!n); return check; void init() Node *p;head1=(Node*)malloc(sizeof(Node);head2=(Node*)malloc(sizeof(Node);p=(Node*)malloc(s
3、izeof(Node);head1-next=p;head2-size=MAX_SIZE;adr=0;next=NULL;id=0;Node* assignment1(int num,int req) Node *before,*after,*ass;ass=(Node*)malloc(sizeof(Node);before=head1;after=head1-ass-id=num;size=req;while(after-sizeafter=after-if(after=NULL)adr=-1; if(after-size=req) before-next=after-adr=after-a
4、dr;after-size-=req;adr+=req;return ass;void acceptment1(int address,int siz,int rd) Node *before,*after;int insert=0;back1=(Node*)malloc(sizeof(Node);back1-adr=address;size=siz;id=rd;while(!insert&after)/将要被回收的分区插入空闲区(按首址大小从小到大插入)if(after=NULL)|(back1-adr(back1-adr=before-adr)next=back1;next=after;i
5、nsert=1;if(insert)if(back1-adr=before-adr+before-size)/和前边分区合并size+=back1-size;next=back1-free(back1);else if(after&adr+back1-size=after-adr)/和后边分区合并size+=after-id=after-id;free(after);after=back1;printf(t首先分配算法回收内存成功!t首先分配算法回收内存失败!Node* assignment2(int num,int req) Node *before,*after,*ass,*q;q=(No
6、de*)malloc(sizeof(Node);before=head2;after=head2-q=after;adr=q-q-next=q;while(after-size)size)return (ass);void acceptment2(int address,int siz,int rd) back2=(Node*)malloc(sizeof(Node);back2-if(head2-next=NULL)/空闲队列为空next=back2;size=back2-/空闲队列不为空while(after)if(back2-adr=after-adr+after-/和前边空闲分区合并si
7、ze+=back2-back2=after;adr=back2-adr+back2-/和后边空闲区合并insert)/将被回收的块插入到恰当的位置(按分区大小从小到大)if(after=NULL|(after-sizesize)&(before- before- back2- insert=1;break; else before=before- after=after-t最佳适应算法回收内存成功!t最佳适应算法回收内存失败!void print(char choice)/输出空闲区队列信息if(choice=|choice=p=head1-p=head2-if(p)n空闲区队列的情况为:t编
8、号t首址t终址t大小nwhile(p)t%dt%dt%dt%dn,p-id,p-adr,p-size-1,p-size);p=p- void menu()/菜单及主要过程char chose;int ch,num,r,add,rd; while(1)system(cls选择最先适应算法请输入F,选择最佳适应算法请输入B,退出程序请输入Enn请输入你的选择:scanf(%c,&chose);if(chose=e|chose=Eexit(0);while(1)最先适应算法(First-Fit)模拟:bB最佳适应算法(Best-Fit)模拟:1.分配内存,2.回收内存,3.查看内存,4.返回nn%d
9、ch);fflush(stdin);switch(ch)case 1:输入申请的分区大小:r);assign=assignment1(num,r);assign=assignment2(num,r);if(assign-adr=-1)分配内存失败!else 分配成功!分配的内存的首址为:%dn,assign-adr);case 2:输入释放的内存的首址:add);输入释放的内存的大小:输入释放的内存的编号:rd);if(check(add,r,chose)acceptment1(add,r,rd);acceptment2(add,r,rd);case 3:print(chose);case 4:menu(); void main()/主函数 init();四、 实验结果五、 实验总结通过这次课程设计我练习了用C语言写系统软件,对操作系统中可变分区存储管理有了更深刻的了解。在写程序的时候也遇到了一些困难。比如在设计数据结构时特别犹豫,总想找一个很合适的。但是,后来才知道,关键要多尝试,而空想是没有用的。最后我证实了自己的设计的合理性。还有为了使程序更健壮,在网上下载了几个代码,进行调试,运行、查看结果。看懂代码和结果后,这次实验也算是成功的一大半了。总之这次实验还是让我收获很大,让我在书本上的知识能够运用到实际当中。这种学以致用的感觉才是最好的。