⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 changzhengshu.txt

📁 利用双向循环链表为主要存储结构
💻 TXT
字号:
 /*to add the two integers*/
#include "stdio.h"
#include "string.h"

typedef struct dbnode
{
  int data;
  struct dbnode *prior,*next;
}dblinklist;
/*to define the doublelinklist*/
dblinklist *m,*n,*sum;
int done1,done2,len1,len2;
/*to initiate the doublelinklist*/
int initiate()
{
  m=(dblinklist *)malloc(sizeof(dblinklist));
  m->prior=m->next=m;
  n=(dblinklist *)malloc(sizeof(dblinklist));
  n->prior=n->next=n;
  sum=(dblinklist *)malloc(sizeof(dblinklist));
  sum->prior=sum->next=sum;
  return 0;
}

/*to insert the doublelinklist*/
int insert(dblinklist *q,int w,int i)
{
  int k=1;
  dblinklist *p=q, *r;
  r=(dblinklist *)malloc(sizeof(dblinklist));
  r->data=w;
  r->prior=r->next=NULL;
  if(i<0)
    return 0;
  while(k<i)
  {
   p=p->next;
   k++;
  }
 r->next=p->next;
 r->next->prior=r;
 p->next=r;
 r->prior=p;
 return 1;
}
/*to judge magnitude of two integers without considing the sign of two integers*/
int judgement1(dblinklist *m,dblinklist *n,int len1,int len2)
{
  dblinklist *p=m->next,*q=n->next;
  if (len1<len2)
    return -1;
   else if(len1>len2)
      return 1;
    else
    {
      while(p!=m)
        p=p->next;
      while(q!=n)
        q=q->next;
      while(p->data==q->data&&p!=m&&q!=n)
      {
        p=p->prior;
        q=q->prior;
       }
      if(p->data<q->data)
         return -1;
      else if(p->data>q->data)
          return 1;
      else
         return 0;
     }
}
/*n-m&&n>m without considing the sign of two integers*/
int judgement2(dblinklist *m,dblinklist *n)
{
  int summation,count=0;
  dblinklist *p=m->next,*q=n->next;
  while( p!=m&&q!=n)
  {
    if(p->data<0)
    {
      p->data+=10000;
      p->next->data-=1;
     }
    summation=p->data-q->data;
    if(summation<0)
    {
      summation+=10000;
      p->next->data-=1;
     }
     insert(sum,summation,++count);
     p=p->next;
     q=q->next;
   }
   if(q==n&&p!=m)
   {
     while(p!=m)
     {
       if(p->data<0)
       {
        p->data+=10000;
        p->next->data-=1;
       }
      summation=p->data;
      p=p->next;
      insert(sum,summation,++count);
   }
  }
  return 0;
}
/*to print the doublelinklist*/
int printlist1(dblinklist *u)
{
  dblinklist *p=u->next;
  int done=0;
  if(p->data==0&&p->next==u)
  {
    printf("0");
    return 1;
    }
  while(p!=u)
    p=p->next;
    p=p->prior;
  if(p->data!=0)
  {
    done=1;
    printf("%d",p->data);
    p=p->prior;
  }
 while(p!=u)
 {
   if(p->data!=0&&!done)
   {
     done=1;
     printf("%d",p->data);
   }
  else if(p->data!=0&&done)
    printf(",%04d",p->data);
  else if (p->data==0)
  {
   if(done)
     printf(",0000");
  }
  p=p->prior;
  }
  if(!done)
    printf("0");
  return 0;
 }

int inport()
{
 char numstr[10000]={'\0'};
 int z, i, j,sum, count,done,integer[4];
 gotoxy(2,6);
 printf("press 'e' to exit...");
 gotoxy(2,7);
 printf("please input the frist integer:");
 fflush(stdin);

 scanf("%s",numstr);

 if(strcmp(numstr,"E")==0||strcmp(numstr,"e")==0)
   return 0;
 len1=strlen(numstr);
 done1=0;
 if(numstr[0]=='-')
 {
   z=1;
   done1=1;
 }
 else
   z=0;
 done=0;
 count=0;
 for(i=len1-1;i>=z;i--)
 {
   if(numstr[i]!=',')
     integer[done++]=numstr[i]-'0';
   else if(numstr[i]==',')
        continue;
    if(done==4||i==z)
    {
      sum=0;
      for(j=done-1;j>=0;j--)
      sum=sum*10+integer[j];
      insert(m,sum,++count);
      if(done==4)
        done=0;
     }
   }
  len1=count;
  m->data=(1-2*done1)*len1;

  memset(numstr,'\0',10000);
  printf("please input the second integer:");
  scanf("%s",numstr);
  len2=strlen(numstr);
  done2=0;
  if(numstr[0]=='-')
  {
    z=1;
    done2=1;
   }
   else
     z=0;
   done=0;
   count=0;
   for(i=len2-1;i>=z;i--)
   {
     if(numstr[i]!=',')
       integer[done++]=numstr[i]-'0';
       else if(numstr[i]==',')
          continue;
       if(done==4||i==z)
       {
         sum=0;
         for(j=done-1;j>=0;j--)
           sum=sum*10+integer[j];
         insert(n,sum,++count);
         if(done==4)
              done=0;
    }
  }
  len2=count;
  n->data=(1-2*done2)*len2;
  return 1;
}
/*to print the sum of two integers*/
int printlist2(int k)
{
 gotoxy(1,12);
 if(done1)
   printf("-");
  printlist1(m);
  getch();
  if(done2)
    printf("-");
  else
    printf("+");
   printlist1(n);
   printf("=");
   if(!done1&&!done2||done1&&done2)
   {
     if(done1&&done2)
       printf("-");
     printlist1(sum);
    }
   else if(!done1&&done2)
   {
     if(k==1)
       printlist1(sum);
     else if(k==-1)
     {
        printf("-");
        printlist1(sum);
      }
     else
       printf("0\n");
    }
   else if(done1&&!done2)
   {
     if(k==-1)
       printlist1(sum);
     else if (k==1)
     {
       printf("-");
       printlist1(sum);
      }
     else
       printf("0\n");
     }
    printf("\n");
    return 0;
}

int main()
{
  int i,num,sum1,k;
  char *group[80*20*2];
  dblinklist *p=NULL,*q=NULL;
  textcolor(14);
  textbackground(1);
  clrscr();
  while(1)
  {
     gotoxy(30,2);
     textcolor(14);
     printf("adding two long integers");
     gotoxy(15,3);
     textcolor(4);
     printf("designed by  liudali   ");
     gotoxy(30,4);
     textcolor(14);
     printf("my changzhengshu");
     gettext(1,1,80,20,group);
     clrscr();
     puttext(1,1,80,20,group);
     textcolor(14);
     initiate();
     k=inport();
     if(!k)
       return 0;
     clrscr();
     gotoxy(1,12);
     if(done1)
       printf("-");
     printlist1(m);
     if(done2)
       printf("-");
     else
       printf("+");
     printlist1(n);
     printf("=");
     p=m->next;
     q=n->next;
     num=0;
     i=0;
     if(!done1&&!done2||done1&&done2)    /*to deal with two integers with the same sign*/
     {
       while(p!=m&&q!=n)
       {
         sum1=p->data+q->data+num;
         num=sum1/10000;
         sum1%=10000;
         insert(sum,sum1,++i);
         p=p->next;
         q=q->next;
       }
       if(p==m&&q!=n)
       {
         while(q!=n)
         {
           sum1=q->data+num;
           num=sum1/10000;
           sum1%=10000;
           insert(sum,sum1,++i);
           q=q->next;
         }
        }
       else if(p!=m&&q==n)
         {
           while(p!=m)
           {
            sum1=p->data+num;
            num=sum1/10000;
            sum1%=10000;
            insert(sum,sum1,++i);
            p=p->next;
           }
         }
        if(num)
          insert(sum,num,++i);
        }
      else if(!done1&&done2)
      {
        k=judgement1(m,n,len1,len2);
        if(k==1)
          judgement2(m,n);
        else if(k==-1)
           judgement2(n,m);
        }
      else if(done1&&!done2)
      {
          k=judgement1(n,m,len1,len2);
          if(k==-1)
             judgement2(n,m);
          else if(k==1)
              judgement2(m,n);
        }
     printlist2(k);
     p=m->next;
     while(p!=m)
     {
        q=p;
        free(p);
        p=q->next;
      }
     free(m);
     q=n->next;
     while(q!=n)
     {
       p=q;
       free(q);
       q=p->next;
     }
     free(n);
     q=sum->next;
     while(q!=sum)
     {
       p=q;
       free(q);
       q=p->next;
     }
    free(sum);
   }
  closegraph();
  return 0;
}













































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -