用链表逆序存储整数(数字字符串),实现两个整数的加法,把结果通过链表返回(超大数据的运算方法)

实现方法: 分别创建两个链表(头插法)逆序保存要相加的数,然后将这两个链表当作实参传入函数,在函数内创建第三个链表,用来保存相加的结果,新建节点的条件是:相加的两个链表只要其中一个还有节点以及相加产生进位,最后该函数返回保存结果的链表的首节点的地址。

代码展示: 

#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);
}

运行实例:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的用 C 语言实现单向链表长正整数加法的程序。 ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int digit; struct Node* next; } Node; Node* createNode(int digit) { Node* newNode = (Node*) malloc(sizeof(Node)); newNode->digit = digit; newNode->next = NULL; return newNode; } Node* createList(char* num) { Node* head = createNode(-1); Node* tail = head; for (int i = 0; num[i] != '\0'; i++) { tail->next = createNode(num[i] - '0'); tail = tail->next; } return head; } Node* addTwoNumbers(Node* num1, Node* num2) { Node* head = createNode(-1); Node* tail = head; int carry = 0; while (num1 != NULL || num2 != NULL || carry != 0) { int sum = carry; if (num1 != NULL) { sum += num1->digit; num1 = num1->next; } if (num2 != NULL) { sum += num2->digit; num2 = num2->next; } carry = sum / 10; tail->next = createNode(sum % 10); tail = tail->next; } return head->next; } void printList(Node* head) { Node* curr = head; while (curr != NULL) { printf("%d", curr->digit); curr = curr->next; } printf("\n"); } int main() { char num1[] = "123456789012345678901234567890"; char num2[] = "987654321098765432109876543210"; Node* list1 = createList(num1); Node* list2 = createList(num2); Node* sum = addTwoNumbers(list1->next, list2->next); printList(sum); return 0; } ``` 在这个程序,我们首先定义了一个 `Node` 结构体,表示链表的每个节点。我们还定义了 `createNode` 函数,用于创建一个新的节点。`createList` 函数用于将一个字符串转换为链表。`addTwoNumbers` 函数用于将两个链表相加,并返回结果链表。最后,我们定义了 `printList` 函数,用于打印链表数字。 在 `main` 函数,我们创建了两个长正整数链表,将它们相加,并打印出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值