用c语言单向链表设计一个程序实现两个任意超长的正整数求和运算
时间: 2023-05-22 15:02:13 浏览: 183
以下是用 C 语言单向链表设计的程序,可以实现两个任意超长的正整数求和运算:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createNode(int val) {
ListNode* node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* dummy = createNode(0);
ListNode* curr = dummy;
int carry = 0;
while (l1 || l2 || carry) {
int sum = carry;
if (l1) {
sum += l1->val;
l1 = l1->next;
}
if (l2) {
sum += l2->val;
l2 = l2->next;
}
carry = sum / 10;
curr->next = createNode(sum % 10);
curr = curr->next;
}
return dummy->next;
}
int main() {
char num1[1000], num2[1000];
printf("请输入两个正整数:\n");
scanf("%s %s", num1, num2);
int len1 = strlen(num1), len2 = strlen(num2);
ListNode* l1 = NULL, *l2 = NULL;
for (int i = len1 - 1; i >= 0; i--) {
ListNode* node = createNode(num1[i] - '0');
node->next = l1;
l1 = node;
}
for (int i = len2 - 1; i >= 0; i--) {
ListNode* node = createNode(num2[i] - '0');
node->next = l2;
l2 = node;
}
ListNode* res = addTwoNumbers(l1, l2);
printf("结果为:");
while (res) {
printf("%d", res->val);
res = res->next;
}
printf("\n");
return 0;
}
```
这个程序中,我们首先定义了一个链表节点结构体 `ListNode`,包含一个整数值 `val` 和一个指向下一个节点的指针 `next`。然后我们定义了一个 `createNode` 函数,用于创建一个新的节点。接着我们定义了一个 `addTwoNumbers` 函数,用于实现两个链表的求和运算。在这个函数中,我们使用了一个虚拟头节点 `dummy`,以及一个指向当前节点的指针 `curr`,来构建结果链表。我们同时遍历两个输入链表 `l1` 和 `l2`,将它们的对应节点的值相加,并加上进位 `carry`,得到当前位的和 `sum`。然后我们将 `sum` 对 10 取模得到当前位的值,并将 `sum` 除以 10 得到进位。我们将当前位的值作为一个新的节点插入到结果链表中,并将 `curr` 指向这个新节点。最后,我们返回结果链表的头节点。
在 `main` 函数中,我们首先读入两个正整数 `num1` 和 `num2`,然后将它们转换成链表 `l1` 和 `l2`。我们将 `num1` 和 `num2` 中的每一位都转换成一个节点,并将这些节点插入到链表的头部。然后我们调用 `addTwoNumbers` 函数,将 `l1` 和 `l2` 作为参数传入,得到结果链表 `res`。最后,我们遍历 `res`,将每个节点的值输出即可。
希望这个程序能够帮助你解决问题!
阅读全文