求编程:实现两个长整数相加:要求用链表(单链表或双向链表)实现两个任意数的整数相加。

把注解,设计思路也写一些吧,谢谢了

第1个回答  推荐于2017-11-25
#include<stdio.h>
#include<stdlib.h>
//定义结点
typedef struct LNode
{
char data; //用一个字符表示一位
struct LNode *previous;//由于计算是从低位开始的,所以将头指针放在最后
}LNode,*LinkList;

//创建链表
void CreateList(LinkList &L)
{
L=(LinkList)malloc(sizeof(LNode));
L->previous=NULL; //这个不能少
char x;
LinkList p;
//一直输入字符直至输入换行键
while((x=getchar())!='\n')
{
//初始化节点数据
p=(LinkList)malloc(sizeof(LNode));
p->data=x;
//将结点插入到链表中
p->previous=L->previous;
L->previous=p;
}
}

//实现两个数相加,并将值以字符形式保存到一个新链表中
void Add(LinkList L1,LinkList L2,LinkList &L3)//由于L3链表要发生改变,所以要引用(即前面带&)
{
LinkList p1,p2,p3;
p1=L1;
p2=L2;

L3=(LinkList)malloc(sizeof(LNode));
L3->previous=NULL;
int carry=0; //两个数对应位相加产生的进位,初始化为0
//对应位没加完
while(p1->previous&&p2->previous)
{
p1=p1->previous;
p2=p2->previous;
//为新节点申请空间
p3=(LinkList)malloc(sizeof(LNode));
//求新节点里面的值,关键
p3->data=(char)(((int)(p1->data)-48+(int)(p2->data)-48+carry)%10+48);//字符'0'~'9'的ASCII值为48~57
carry=((int)(p1->data)-48+(int)(p2->data)-48+carry)/10;
//将新节点加入到链表中
p3->previous=L3->previous;
L3->previous=p3;
}
//对应位加完了,且第一个数大,思路和上面的基本差不多
while(p1->previous)
{
p1=p1->previous;

p3=(LinkList)malloc(sizeof(LNode));
p3->data=(char)(((int)(p1->data)-48+carry)%10+48); carry=((int)(p1->data)-48+carry)/10;
p3->previous=L3->previous;
L3->previous=p3;
}
//对应位加完了,且第二个数大
while(p2->previous)
{
p2=p2->previous;

p3=(LinkList)malloc(sizeof(LNode));
p3->data=(char)(((int)(p2->data)-48+carry)%10+48); carry=((int)(p2->data)-48+carry)/10;
p3->previous=L3->previous;
L3->previous=p3;
}
}
//输出链表中的数据
void Print(LinkList L)
{
while(L->previous)
{
L=L->previous;
printf("%c",L->data);
}
printf("\n");
}

void main()
{
LinkList L1,L2,L3;

printf("请输入第一个数:\n");
CreateList(L1);
printf("请输入第二个数:\n");
CreateList(L2);

Add(L1,L2,L3);

printf("两数相加结果如下:\n");
Print(L3);
}

//上面代码运行非常OK。这个题目,可花了我不少时间呢,15个财富值,太少了吧,可得多给点哦!本回答被网友采纳
相似回答