程序 大家来指点
<P>这叫什么程序 有没有错误 能够运行吗?<BR><BR><BR><BR>#include "stdio.h"<BR>#include "stdlib.h"<BR>#include "string.h"<BR>#define MAX 32767<BR>typedef struct node <BR>{<BR> int address,size;<BR> struct node *next;<BR>}RECT;<BR>RECT *assignment(RECT *head,int application);<BR>void acceptment1(RECT *head,RECT *back1);<BR>void acceptment2(RECT *head,RECT *back1) ;<BR>int backcheck(RECT *head,RECT *back1);<BR>void print(RECT *head);<BR>RECT *head,*back,*assign1,*p;<BR>int application1,maxblocknum;<BR>char way;<BR>/*主函数*/<BR>main()<BR>{<BR> char choose[10];<BR> int check;<BR> head=malloc(sizeof(RECT)); <BR> p=malloc(sizeof(RECT));<BR> head->size=MAX;<BR> head->address=0;<BR> head->next=p;<BR> maxblocknum=1;<BR> p->size=MAX;<BR> p->address=0;<BR> p->next=NULL;<BR> print(head); <BR> printf("Enter the way(best or first(b/f)\n");<BR> scanf("%c",&way);<BR> do{<BR> printf("Enter the assign or accept(as/ac)\n");<BR> scanf("%s",choose); /*选择分配或回收*/<BR> if(strcmp(choose,"as")==0) <BR> {<BR> printf("Input application:\n");<BR> scanf("%d",&application1);<BR> assign1=assignment(head,application1);<BR> if(assign1->address==-1)<BR> printf("Too large application!,assign fails!!\n\n");<BR> else<BR> printf("Success!!ADDRESS=%5d\n",assign1->address); <BR> print(head);<BR> }<BR> else<BR> if(strcmp(choose,"ac")==0) /*回收*/<BR> {<BR> back=malloc(sizeof(RECT));<BR> printf("Input Adress and Size!!\n");<BR> scanf("%d%d",&back->address,&back->size);<BR> check=backcheck(head,back); <BR> if(check==1)<BR> {<BR> if(tolower(way)=='f')/*首先适应算法*/<BR> acceptment1(head,back); /*首先适应*/<BR> else<BR> acceptment2(head,back);/*最佳适应*/<BR> print(head);<BR> }<BR> }<BR> }while(!strcmp(choose,"as")||!strcmp(choose,"ac"));<BR>}<BR>/*分配函数*/<BR>RECT *assignment(RECT *head,int application)<BR>{<BR> RECT *after,*before,*assign;<BR> assign=malloc(sizeof(RECT)); <BR> assign->size=application;<BR> assign->next=NULL;<BR> if(application>head->size||application<=0)<BR> assign->address=-1; /*申请无效*/<BR> else<BR> {<BR> before=head;<BR> after=head->next;<BR> while(after->size<application)<BR> {<BR> before=before->next;<BR> after=after->next;<BR> }<BR> if(after->size==application) /*结点大小等于申请大小则完全分配*/<BR> {<BR> if(after->size==head->size)<BR> maxblocknum--;<BR> before->next=after->next;<BR> assign->address=after->address;<BR> free(after);<BR> }<BR> else<BR> {<BR> if(after->size==head->size) maxblocknum--;<BR> after->size=after->size-application; /*大于申请空间则截取相应大小分配*/<BR> assign->address=after->address+after->size;<BR> if(tolower(way)=='b')<BR> {<BR> before->next=after->next;<BR> back=after;<BR> acceptment2(head,back);<BR> }<BR> }<BR> if(maxblocknum==0) <BR> {<BR> before=head;<BR> head->size=0;<BR> maxblocknum=1;<BR> while(before!=NULL)<BR> {<BR> if(before->size>head->size)<BR> {<BR> head->size=before->size;<BR> maxblocknum=1;<BR> }<BR> else<BR> if(before->size==head->size)<BR> maxblocknum++;<BR> before=before->next;<BR> }<BR> }<BR> }<BR> assign1=assign;<BR> return assign1; <BR>}<BR>void acceptment1(RECT *head,RECT *back1)/*首先适应*/<BR>{<BR> RECT *before,*after;<BR> int insert;<BR> before=head;<BR> after=head->next;<BR> insert=0;<BR> while(!insert) <BR> {<BR> if((after==NULL)||<BR> ((back1->address<=after->address)&&<BR> (back1->address>=before->address)))<BR> {<BR> before->next=back1;<BR> back1->next=after;<BR> insert=1;<BR> }<BR> else<BR> {<BR> before=before->next;<BR> after=after->next;<BR> }<BR> }<BR> if(back1->address==before->address+before->size)<BR> {<BR> before->size=before->size+back1->size;<BR> before->next=back1->next;<BR> free(back1);<BR> back1=before;<BR> }<BR> if(after!=NULL&&(after->address==back1->address+back1->size))<BR> { <BR> back1->size=back1->size+after->size;<BR> back1->next=after->next;<BR> free(after);<BR> }<BR> if(head->size<back1->size) <BR> {<BR> head->size=back1->size;<BR> maxblocknum=1;<BR> }<BR> else<BR> if(head->size==back1->size)<BR> maxblocknum++;<BR>}<BR>/*最佳适应*/<BR>void acceptment2(RECT *head,RECT *back1)<BR>{<BR> RECT *before,*after;<BR> int insert ;<BR> insert=0;<BR> before=head;<BR> after=head->next;<BR> if(head->next==NULL) <BR> {<BR> head->size=back1->size;<BR> head->next=back1;<BR> maxblocknum++;<BR> back1->next=NULL;<BR> }<BR> else<BR> {<BR> while(after!=NULL) <BR> if(back1->address==after->size+after->address)<BR> {<BR> before->next=after->next;<BR> back->size=after->size+back1->size;<BR> free(after);<BR> after=NULL;<BR> }<BR> else<BR> {<BR> after=after->next;<BR> before=before->next;<BR> }<BR> before=head;<BR> after=head->next;<BR> while(after!=NULL)<BR> if(after->address==back1->size+back1->address) <BR> {<BR> back1->size=back1->size+after->size;<BR> before->next=after->next;<BR> free(after);<BR> after=NULL;<BR> }<BR> else<BR> {<BR> before=before->next;<BR> after=after->next;<BR> }<BR> before=head;<BR> after=head->next;<BR> do{<BR> if(after==NULL||(after->size>back1->size))<BR> {<BR> before->next=back1;<BR> back1->next=after;<BR> insert=1;<BR> }<BR> else<BR> {<BR> before=before->next;<BR> after=after->next;<BR> }<BR> }while(!insert);<BR> if(head->size<back1->size) <BR> {<BR> head->size=back1->size;<BR> maxblocknum++;<BR> }<BR> else<BR> if(head->size==back1->size)<BR> maxblocknum++;<BR> }<BR>}</P><P>void print(RECT *head) <BR>{<BR> RECT *before,*after;<BR> int index,k;<BR> before=head->next;<BR> index=1;<BR> if(head->next==NULL)<BR> printf("NO part for assignment!!\n");<BR> else<BR> {<BR> printf("*****index*******address********end*********size*****\n");<BR> while(before!=NULL)<BR> {<BR> printf("----------------------------------------------------\n");<BR> printf(" %-13d%-13d%-13d%-13d\n",index,before->address,before->address+before->size-1,before->size);<BR> printf("----------------------------------------------------\n");<BR> index++;<BR> before=before->next;<BR> }<BR> }<BR>}<BR>int backcheck(RECT *head,RECT *back1)<BR>{<BR> RECT *before,*after;<BR> int check=1;<BR> if(back1->address<0||back1->size<0)<BR> check=0;<BR> before=head->next;<BR> while((before!=NULL)&&check)<BR> if(((back1->address<before->address)<BR> &&(back1->address+back1->size>before->address))<BR> ||((back1->address>=before->address)<BR> &&(back1->address<before->address+before->size)))<BR> check=0;<BR> else<BR> before=before->next;<BR> if(check==0)<BR> printf("Error input!!\n");<BR> return check; <BR>}</P>
页:
[1]
