用c语言的方式给你两个非空的链表,表示两个非负的整数。它们每位数字都是按照逆序的方式存储的,并且每个节点只能存储一位数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。自己输入链表数字并且将链表打印出来
时间: 2025-01-21 18:33:24 浏览: 43
在C语言中,为了实现这个功能,我们可以使用递归的方式来处理这个问题。首先,我们需要定义一个结构体`Node`来表示链表的节点,包含一个整数值和一个指向下一个节点的指针。接下来,我们将创建两个函数,一个是`addTwoNumbers`用于计算并构建新的链表,另一个是`printList`用于打印链表。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构体
typedef struct Node {
int val; // 节点值
struct Node* next; // 指向下一个节点的指针
} ListNode;
// 创建新节点并添加到链表末尾
ListNode* createNode(int val) {
ListNode* newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->val = val;
newNode->next = NULL;
return newNode;
}
// 将两个链表相加
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
if (!l1 && !l2) return NULL; // 如果两个链表都为空,则返回NULL
int carry = 0, sum;
// 使用递归处理每一位相加
if (l1 && l2) {
sum = l1->val + l2->val + carry;
carry = sum / 10;
ListNode* result = createNode(sum % 10);
result->next = addTwoNumbers(l1->next, l2->next);
return result;
} else {
ListNode* temp = l1 ? l1 : l2;
while (temp) {
sum = temp->val + carry;
carry = sum / 10;
ListNode* result = createNode(sum % 10);
temp->next = result;
temp = temp->next;
}
if (carry) { // 如果还有进位,添加一个新的节点
ListNode* result = createNode(carry);
result->next = NULL;
return result;
} else {
return NULL; // 如果没有进位,直接返回链表头节点
}
}
}
// 打印链表
void printList(ListNode* head) {
ListNode* temp = head;
while (temp) {
printf("%d", temp->val);
temp = temp->next;
if (temp) printf(", ");
}
printf("\n");
}
int main() {
// 请在这里手动创建两个逆序的链表示数
// 示例:
// 输入链表 1 -> 2 -> 3 可能代表数字 321
// 输入链表 4 -> 5 -> 6 可能代表数字 654
// 替换为实际的链表操作
// ListNode* list1 = ...;
// ListNode* list2 = ...;
ListNode* result = addTwoNumbers(list1, list2);
printf("Result chain list: ");
printList(result);
return 0;
}
```
在这个示例中,你需要在`main()`函数中手动创建代表两个非负整数的链表,并将其传递给`addTwoNumbers`函数。最后,`printList`会打印出结果链表。记得,由于这是一个文本环境,你无法直接在此处创建链表,需要你自己编写链表的创建部分。
阅读全文
相关推荐

















