1、主要流程和源代码实验二源代码includestdio.hincludeincludestring。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(int add,int siz,char c) Node p,head;int check=1;if(add0|siz0)check=0;/*地址和大小不能为负/if(c=fc=F)head=hea
2、d1;elsehead=head2;p=headnext;while(p!=NULL)check) if(addpadr)&(add+sizpadr)|(add=p-adr)&(addp-adr+psize) check=0; else p=p-next;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(sizeof(Node);head1nex
3、t=p;head2next=p;p-size=MAX_SIZE;adr=0;next=NULL;p-id=0;Node* assignment1(int num,int req) Node before,after,ass;ass=(Node*)malloc(sizeof(Node);before=head1;after=head1-next;assid=num;asssize=req;while(aftersizeadr=-1; if(aftersize=req) beforenext=afterassadr=after-adr;after-size-=req;assadr=afteraft
4、er-adr+=req;return ass;void acceptment1(int address,int siz,int rd) Node before,after;int insert=0;back1=(Node*)malloc(sizeof(Node);after=head1-next;back1-adr=address;back1size=siz;back1id=rd;back1-next=NULL;while(!insert&after)/将要被回收的分区插入空闲区(按首址大小从小到大插入)if(after=NULL)(back1-adradr)&(back1adr=before
5、-adr)next=back1;back1next=after;insert=1;before=before-after=afterif(insert)if(back1-adr=before-adr+beforesize)/和前边分区合并before-size+=back1-size;next=back1-next;free(back1);else if(afterback1adr+back1size=afteradr)/和后边分区合并back1size+=aftersize;back1next=after-back1-id=afterid;free(after);after=back1;pr
6、intf(”t首先分配算法回收内存成功!);printf(t首先分配算法回收内存失败!Node* assignment2(int num,int req) Node *before,*after,ass,*q;ass=(Node)malloc(sizeof(Node);q=(Node)malloc(sizeof(Node);before=head2;after=head2-size=req;sizereq)after=afternext;assadr=1;if(after-size=req)beforenext=after-adr=after-adr;q=after;adr=qadr;q-si
7、ze-=req;qadr+=req;before=head2;after=head2next;next=q;qnext=NULL;while(aftersize)size)before=beforenext;after=after-next;next=q;qnext=after;return (ass);void acceptment2(int address,int siz,int rd) Node before,after;back2=(Node)malloc(sizeof(Node);back2-adr=address;back2-size=siz;back2id=rd;back2-ne
8、xt=NULL;if(head2-next=NULL)/空闲队列为空head2next=back2;head2-size=back2-size;/空闲队列不为空while(after)if(back2adr=afteradr+after-size)/和前边空闲分区合并aftersize+=back2size;back2=after;after=head2-next;if(afteradr=back2-adr+back2-size)/和后边空闲区合并next=after-back2size+=aftersize;before=before-next;insert)/将被回收的块插入到恰当的位置(
9、按分区大小从小到大)if(after=NULL|(aftersizesize)&(before-sizeback2size) beforenext=back2; back2-next=after; insert=1;break; before=before after=afternext;t最佳适应算法回收内存成功!printf(”t最佳适应算法回收内存失败!n”);void print(char choice)/输出空闲区队列信息Node p;if(choice=fchoice=F)p=head1next;p=head2next;if(p)n空闲区队列的情况为:printf(”t编号t首址t
10、终址t大小n”);while(p)tdt%dt%dt%dn”,p-id,padr,padr+p-size-1,psize);p=p void menu()/菜单及主要过程char chose;int ch,num,r,add,rd; while(1)system(”cls”);选择最先适应算法请输入F,选择最佳适应算法请输入B,退出程序请输入Ennprintf(”请输入你的选择:scanf(”%c”,&chose);if(chose=e|chose=Eexit(0);system(clswhile(1)if(chose=f|chose=Fprintf(”最先适应算法(First-Fit)模拟:
11、if(chose=b|chose=B最佳适应算法(Best-Fit)模拟:1.分配内存,2。回收内存,3。查看内存,4。返回nnscanf(%d”,&ch);fflush(stdin);switch(ch)case 1:printf(”输入申请的分区大小:”);scanf(”d”,r);if(chose=f|chose=F)assign=assignment1(num,r);assign=assignment2(num,r);if(assign-adr=-1)printf(”分配内存失败!else printf(”分配成功!分配的内存的首址为:dn”,assignadr);break;case
12、 2:输入释放的内存的首址:scanf(”%d”,add);输入释放的内存的大小:d”,r);printf(”输入释放的内存的编号:scanf(”d”,rd);if(check(add,r,chose)f|chose=acceptment1(add,r,rd);acceptment2(add,r,rd);case 3:print(chose);case 4:menu(); void main()/主函数 init();menu();四、实验结果五、实验总结通过这次课程设计我练习了用C语言写系统软件,对操作系统中可变分区存储管理有了更深刻的了解。在写程序的时候也遇到了一些困难。比如在设计数据结构时特别犹豫,总想找一个很合适的。但是,后来才知道,关键要多尝试,而空想是没有用的。最后我证实了自己的设计的合理性。还有为了使程序更健壮,在网上下载了几个代码,进行调试,运行、查看结果。看懂代码和结果后,这次实验也算是成功的一大半了。总之这次实验还是让我收获很大,让我在书本上的知识能够运用到实际当中。这种学以致用的感觉才是最好的。