大整数加法求改错(进位时输出少了最高位。。。)
#include<iostream>#include<string>
using namespace std;
#include"conio.h"
//子程序
//表示这是要用链表做的节奏
typedef struct node
{
int data;
struct node *next;
}node,*LinkList;
//单链表的初始化
int InitList(LinkList &L)
{//构造一个空的单链表L
L=new node;//生成新结点作为头结点,用头指针L指向头结点
L->next=NULL;//头结点的指针域置空
return 1;
}
//前插法创建单链表
void CreateList_H(LinkList &L,string s)//这是一个函数
{//逆位序输入n个元素的值,建立带表头结点的单链表L
LinkList p;
int i,a;
for(i=0;i<s.size();i++)
{
a=s[i]-'0';//将字符转化为数字
p=new node;//生成新结点*p
p->data=a;//输入元素赋值给新结点*p的数据域
p->next=L->next;L->next=p;//将新结点*p插入到头结点之后
}
}
//整数相加
void add(LinkList L1,LinkList L2,LinkList L)
{
LinkList p,p1,p2;
int d,num;
p=L->next;
p1=L1->next;
p2=L2->next;
d=0;
//因为前插法是倒序,故,当L1,L2第一个都是数字的时候
while(p1&&p2)
{
num=p1->data+p2->data+d;//L1和L2第一个数字相加考虑进位
d=num/10;//进位时的那个1
num=num%10;//留下进入L的数字
p->data=num;
p1=p1->next;
p2=p2->next;
p=p->next;
}
//当加到后来有一个数已经加完了,然后另一个数还有的状态。考虑进位。
while(d&&p)
{
num=p->data+d;//由于上面已经把剩下的那个数给了L,所以用p->data。
d=num/10;
num=num%10;
p->data=num;
p=p->next;
}
//如果两边都加完了,就剩下一个可以进位的数字d
if(d)
{
p=new node;//再开出一个结点来存放进位的d,但是看上一段程序可知已经到了p->next
p->data=d;//那最后一个q,即r的数值就等于d
p->next=NULL;//然后r的后面的后面就没有数字了
}
}
//逆置
void inverse(LinkList &L)
{
LinkList p,q,r;
p=L;
q=L->next;
p->next=NULL;
while(q)
{
r=q->next;
q->next=p->next;
p->next=q;
q=r;
}
}
//输出相加后的结果链表L
void output(LinkList L)
{
LinkList p;
p=L->next;
while(p!=NULL)
{
cout<<p->data;
p=p->next;
}
cout<<endl;
}
//主程序
int main()
{
int T,k;
cin>>T;
for(k=0;k<T;k++)
{
string s1,s2;
cin>>s1;
cin>>s2;
LinkList L1,L2,L;
InitList(L1);
InitList(L2);
InitList(L);
CreateList_H(L1,s1);
CreateList_H(L2,s2);
L=s1.size()>s2.size()?L1:L2;
add(L1,L2,L);
inverse(L);
output(L);
}
return 0;
}