jianglongyun 发表于 2007-6-1 15:20

程序 大家来指点

<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-&gt;size=MAX;<BR>   head-&gt;address=0;<BR>   head-&gt;next=p;<BR>   maxblocknum=1;<BR>   p-&gt;size=MAX;<BR>   p-&gt;address=0;<BR>   p-&gt;next=NULL;<BR>   print(head);  <BR>   printf("Enter the way(best or first(b/f)\n");<BR>   scanf("%c",&amp;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",&amp;application1);<BR>     assign1=assignment(head,application1);<BR>     if(assign1-&gt;address==-1)<BR>        printf("Too large application!,assign fails!!\n\n");<BR>     else<BR>        printf("Success!!ADDRESS=%5d\n",assign1-&gt;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",&amp;back-&gt;address,&amp;back-&gt;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-&gt;size=application;<BR>   assign-&gt;next=NULL;<BR>   if(application&gt;head-&gt;size||application&lt;=0)<BR>      assign-&gt;address=-1; /*申请无效*/<BR>   else<BR>   {<BR>      before=head;<BR>      after=head-&gt;next;<BR>      while(after-&gt;size&lt;application)<BR>      {<BR>     before=before-&gt;next;<BR>     after=after-&gt;next;<BR>      }<BR>      if(after-&gt;size==application) /*结点大小等于申请大小则完全分配*/<BR>      {<BR>     if(after-&gt;size==head-&gt;size)<BR>        maxblocknum--;<BR>     before-&gt;next=after-&gt;next;<BR>     assign-&gt;address=after-&gt;address;<BR>     free(after);<BR>      }<BR>      else<BR>      {<BR>     if(after-&gt;size==head-&gt;size) maxblocknum--;<BR>     after-&gt;size=after-&gt;size-application; /*大于申请空间则截取相应大小分配*/<BR>     assign-&gt;address=after-&gt;address+after-&gt;size;<BR>     if(tolower(way)=='b')<BR>     {<BR>        before-&gt;next=after-&gt;next;<BR>        back=after;<BR>        acceptment2(head,back);<BR>     }<BR>      }<BR>      if(maxblocknum==0) <BR>      {<BR>     before=head;<BR>     head-&gt;size=0;<BR>     maxblocknum=1;<BR>     while(before!=NULL)<BR>     {<BR>        if(before-&gt;size&gt;head-&gt;size)<BR>        {<BR>           head-&gt;size=before-&gt;size;<BR>           maxblocknum=1;<BR>        }<BR>        else<BR>           if(before-&gt;size==head-&gt;size)<BR>          maxblocknum++;<BR>        before=before-&gt;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-&gt;next;<BR>   insert=0;<BR>   while(!insert) <BR>   {<BR>      if((after==NULL)||<BR>     ((back1-&gt;address&lt;=after-&gt;address)&amp;&amp;<BR>       (back1-&gt;address&gt;=before-&gt;address)))<BR>      {<BR>     before-&gt;next=back1;<BR>     back1-&gt;next=after;<BR>     insert=1;<BR>      }<BR>      else<BR>      {<BR>     before=before-&gt;next;<BR>     after=after-&gt;next;<BR>      }<BR>   }<BR>   if(back1-&gt;address==before-&gt;address+before-&gt;size)<BR>   {<BR>      before-&gt;size=before-&gt;size+back1-&gt;size;<BR>      before-&gt;next=back1-&gt;next;<BR>      free(back1);<BR>      back1=before;<BR>   }<BR>   if(after!=NULL&amp;&amp;(after-&gt;address==back1-&gt;address+back1-&gt;size))<BR>   {  <BR>      back1-&gt;size=back1-&gt;size+after-&gt;size;<BR>      back1-&gt;next=after-&gt;next;<BR>      free(after);<BR>   }<BR>   if(head-&gt;size&lt;back1-&gt;size) <BR>   {<BR>      head-&gt;size=back1-&gt;size;<BR>      maxblocknum=1;<BR>   }<BR>   else<BR>      if(head-&gt;size==back1-&gt;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-&gt;next;<BR>   if(head-&gt;next==NULL) <BR>   {<BR>      head-&gt;size=back1-&gt;size;<BR>      head-&gt;next=back1;<BR>      maxblocknum++;<BR>      back1-&gt;next=NULL;<BR>   }<BR>   else<BR>   {<BR>      while(after!=NULL) <BR>      if(back1-&gt;address==after-&gt;size+after-&gt;address)<BR>      {<BR>     before-&gt;next=after-&gt;next;<BR>     back-&gt;size=after-&gt;size+back1-&gt;size;<BR>     free(after);<BR>     after=NULL;<BR>      }<BR>      else<BR>      {<BR>     after=after-&gt;next;<BR>     before=before-&gt;next;<BR>      }<BR>      before=head;<BR>      after=head-&gt;next;<BR>      while(after!=NULL)<BR>      if(after-&gt;address==back1-&gt;size+back1-&gt;address) <BR>      {<BR>     back1-&gt;size=back1-&gt;size+after-&gt;size;<BR>     before-&gt;next=after-&gt;next;<BR>     free(after);<BR>     after=NULL;<BR>      }<BR>      else<BR>      {<BR>     before=before-&gt;next;<BR>     after=after-&gt;next;<BR>      }<BR>      before=head;<BR>      after=head-&gt;next;<BR>      do{<BR>     if(after==NULL||(after-&gt;size&gt;back1-&gt;size))<BR>     {<BR>        before-&gt;next=back1;<BR>        back1-&gt;next=after;<BR>        insert=1;<BR>     }<BR>     else<BR>     {<BR>        before=before-&gt;next;<BR>        after=after-&gt;next;<BR>     }<BR>      }while(!insert);<BR>      if(head-&gt;size&lt;back1-&gt;size) <BR>      {<BR>     head-&gt;size=back1-&gt;size;<BR>     maxblocknum++;<BR>      }<BR>      else<BR>     if(head-&gt;size==back1-&gt;size)<BR>        maxblocknum++;<BR>   }<BR>}</P>
<P>void print(RECT *head) <BR>{<BR>   RECT *before,*after;<BR>   int index,k;<BR>   before=head-&gt;next;<BR>   index=1;<BR>   if(head-&gt;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-&gt;address,before-&gt;address+before-&gt;size-1,before-&gt;size);<BR>     printf("----------------------------------------------------\n");<BR>     index++;<BR>     before=before-&gt;next;<BR>      }<BR>   }<BR>}<BR>int backcheck(RECT *head,RECT *back1)<BR>{<BR>   RECT *before,*after;<BR>   int check=1;<BR>   if(back1-&gt;address&lt;0||back1-&gt;size&lt;0)<BR>      check=0;<BR>   before=head-&gt;next;<BR>   while((before!=NULL)&amp;&amp;check)<BR>      if(((back1-&gt;address&lt;before-&gt;address)<BR>     &amp;&amp;(back1-&gt;address+back1-&gt;size&gt;before-&gt;address))<BR>     ||((back1-&gt;address&gt;=before-&gt;address)<BR>    &amp;&amp;(back1-&gt;address&lt;before-&gt;address+before-&gt;size)))<BR>     check=0;<BR>      else<BR>     before=before-&gt;next;<BR>   if(check==0)<BR>      printf("Error input!!\n");<BR>   return check;  <BR>}</P>

边城路人 发表于 2007-6-4 09:08

这么长的代码是你写的<BR>还是下的<BR>能不能运行你测试一下就知道了

页: [1]

编程论坛