【问题描述】
给定两个用链表表示的整数,每个节点包含一个数位。这些数位是反向存放的,也就是个位排在链表首部。编写函数对这两个整数求和,并用链表形式返回结果。
输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295
输出:2 -> 1 -> 9,即912
【输入形式】
第一行输入第1个整数(逆序);
第二行输入第2个整数(逆序);
每个数位以空格分隔。
【输出形式】
输出和的逆序。
【样例输入】
7 1 6 e
5 9 2 e
【样例输出】
2 1 9
【样例说明】
样例中的e,表示输入以非法整数作为输入结束;
两个整数的位数不一定相同,即有可能1+11111
也可能会出现,某个整数不存在的情况(即链表为空链的情况)
【评分标准】
不允许修改程序其他结构,只补充加法函数。
#include
#includetypedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LNode,*LinkList;LinkList initList()
{
LinkList head;
head=(LinkList)malloc(sizeof(LNode));
if(head==NULL)
{
return NULL;
}
head->next=NULL;
return head;
}
//在链表末尾插入结点,并返回尾指针
LinkList insertListTail(LinkList tail, ElemType e)
{
LinkList s;
if(tail==NULL)
{
return 0;
}
s=(LinkList)malloc(sizeof(LNode));
if(s==NULL)
{
return 0;
}
s->data=e;
s->next=tail->next;
tail->next=s;
tail=s;
return tail;
}
void printList(LinkList head)
{
LinkList p=head->next;
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//函数返回结果链表
LinkList addList(LinkList ha,LinkList hb)
{
int x=0,y=0,i=0,j=0,k;
int a[100],b[100];
LinkList p,q,hc,s;
p=ha->next;
q=hb->next;
if(p==NULL) return hb;
if(q==NULL) return ha;
while(p){
a[i++]=p->data;
p=p->next;
}
i--;
while(i>=0){
x=x*10+a[i];
i--;
}
while(q){
b[j++]=q->data;
q=q->next;
}
j--;
while(j>=0){
y=y*10+b[j];
j--;
}
hc=(LinkList)malloc(sizeof(LNode));
hc->next=NULL;
s=hc;
int sum=x+y;
while(sum){
LinkList r=(LinkList)malloc(sizeof(LNode));
r->next=NULL;
r->data=sum%10;
sum=sum/10;
s->next=r;
s=r;
}
return hc;
}
int main()
{
LinkList ha,ta,hb,tb,hc;
ElemType e;
ta=ha=initList();
tb=hb=initList();
while(scanf("%d",&e)==1){
ta=insertListTail(ta,e);
}
getchar();
while(scanf("%d",&e)==1){
tb=insertListTail(tb,e);
}
// printList(ha);
// printList(hb);
hc=addList(ha,hb);
printList(hc);
return 0;
}