实现方法: 分别创建两个链表(头插法)逆序保存要相加的数,然后将这两个链表当作实参传入函数,在函数内创建第三个链表,用来保存相加的结果,新建节点的条件是:相加的两个链表只要其中一个还有节点以及相加产生进位,最后该函数返回保存结果的链表的首节点的地址。
代码展示:
#include<stdio.h>
#include<stdlib.h>
typedef struct Node {
int data;
struct Node *next;
}node;
//创建链表函数,该函数的返回值为链表第一个节点的地址
node * create_list()
{
int a=0;
node *first=NULL; //保存新创建的链表的第一个结点的地址
node *last=NULL; //保存新创建的链表的最后一个结点的地址
node *p;
while(1)
{
scanf("%d",&a);
if(a==0) //当输入为0的时候链表创建结束
{
break;
}
else
{
p=(node *)malloc(sizeof(node)); //动态分配空间,malloc函数需要包含stdlib.h的头文件
p->next=NULL;
p->data=a;
if(first==NULL) //当链表没有节点时
{
first=p;
last=p;
}
else //当链表中存在节点
{
//头插法
p->next=first;
first=p;
}
}
}
return first; //返回链表第一个节点的地址
}
//打印链表
void print_list(node *list)
{
node *p=list; //遍历链表的指针
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
//用链表逆序存储整数(数字字符串),实现两个整数的加法,把结果通过链表返回(超大数据的运算方法)
node *add_two_list(node * list1, node * list2)
{
//新链表的首尾指针
node *first=NULL;
node *last=NULL;
//遍历相加的两个链表使用的指针
node *p=list1;
node *q=list2;
node *l=NULL;
int a=0,b=0,c=0; //a,b分别用来保存两个链表的值,c保存进位,有进位为1无进位为0
while(p||q||c) //只要两个链表中任何一个还有元素或者有进位都需要新增节点来保存当前的值
{
l=(node *)malloc(sizeof(node));
l->next=NULL;
a=p?p->data:0; //三元运算符如果p存在则a保存p->data的值否则为0.
b=q?q->data:0;
l->data=(a+b+c)%10;
c=(a+b)/10; //c表示进位
if(first==NULL)
{
first=l;
last=l;
}
else
{
//头插法
l->next=first;
first=l;
}
p=p?p->next:NULL; //三元运算符如果p不为NULL则p指针保存下一个节点的地址否则为NULL
q=q?q->next:NULL;
}
return first;
}
int main()
{
node *list1=create_list();
node *list2=create_list();
node *list3=add_two_list(list1, list2);
print_list(list3);
}
运行实例: