现在的位置: 首页 > 综合 > 正文

用单链表实现两个大型整数的相加

2013年10月11日 ⁄ 综合 ⁄ 共 1874字 ⁄ 字号 评论关闭

最近几天一直在忙老师布置的作业,现在小有成就,和大家分享一下。。

#include<stdio.h>
#include<malloc.h>
#define null 0

#define len sizeof(struct lnode)//宏定义结构体的大小
typedef struct lnode {
  int  data;
  struct lnode  *next;
  }lnode ,*list;//定义两个节点类型,一个是普通的一个是指针的
void makelnode(list &l)//创建一个空的节点
{l=(list)malloc(len);
 l->next=null;
}
void creatlist(list &l)//创建链表
{  char c;
   l=(list)malloc(len);//动态申请空间
   l->next=null;
   while((c=getchar())!='/n')//当从键盘输入的不是回车键的时候把该字符放到一个节点中,并把节点都连起来
    {list p;
       p=(list)malloc(len);
      p->data=c-'0';//把节点的数据域里存上数字
     p->next=l->next;//下面两行是把节点连起来
    l->next=p;
    }
}
 void add(list l1,list l2,list &l3)//实现两个链表的相加,相当于两个链表归并成第三个链表
{list p1,p2,p3;
 int sum=0;
 int cy=0;//定义进位标志
 p1=l1->next;//分别始指针指向第一个节点,准备实现个位的相加
p2=l2->next;
 while(p1&&p2)//当两个表的长度相同时,即两个数的个数相同while语句是实现相加并且实现第三个链表的创建
{
  p3=(list)malloc(len);
 sum=p1->data+p2->data+cy;//每个节点只存了一位数
 if(sum>=10)//如果多余一位数,节点处只能存一位而两一个要进位
  {p3->data=sum-10;
   cy=1;//进位标志变为1,为下次相加时候做准备
   }
else if(sum>=0&&sum<10)
 {p3->data=sum;
  cy=0;//没有大于9所以进位标志要归零
}
p1=p1->next;//指针一移到下一个节点,为一个数的十位或百位做准备
p2=p2->next;
p3->next=l3->next;//将创建的节点连起来
l3->next=p3;
}
  while(p1)//当第一个数比第二个数的位数多的时候
{
  p3=(list)malloc(len);
 sum=p1->data+cy;
 if(sum>=10)
{p3->data=sum-10;
cy=1;
}
   else if(sum>=0&&sum<10)
 {p3->data=sum;
  cy=0;
}
 p1=p1->next;
p3->next=l3->next;
l3->next=p3;
}
  while(p2)
{
  p3=(list)malloc(len);
 sum=p2->data+cy;
 if(sum>=10)
 {p3->data=sum-10;
  cy=1;
  }
   else if(sum>=0&&sum<10)
 {p3->data=sum;
  cy=0;
   }
  p2=p2->next;
   p3->next=l3->next;
  l3->next=p3;
  }
  if(cy)//当都加完了,还有进位标志,则在开辟一个空间把它也放到链表中去
  {
   p3=(list)malloc(len);
   p3->data=1;
   p3->next=l3->next;
   l3->next=p3;
  }
 }
 void out (list l)//定义输出函数
 {
   list p;
   p=l->next;
   while(p)
   {printf("%d", p->data);
     p=p->next;
    }
 }
void main()
{
list l1,l2,l3;//定义指针变量,是指向结构体的
 makelnode(l3);//只为打三个来链表创建头结点
printf("please put a number/n");
creatlist(l1);//创建第一个链表
printf("please put another one/n");
creatlist(l2);//创建第二个量链表
add(l1,l2,l3);//实现两个链表的相加,并把结果放在第三个链表中去
out(l3);输出第三个链表
return;
}

抱歉!评论已关闭.