用C++单链表设计一个100位以内的长整数加减运算
时间: 2024-09-07 19:03:42 浏览: 51
在C++中,我们可以使用单链表来表示长整数,因为链表可以动态地存储任意长度的数据。这里我们简单介绍如何使用结构体表示数字节点,并实现加法和减法的基本操作。
首先,定义一个`ListNode`结构体,包含一个整数值和指向下一个节点的指针:
```cpp
struct ListNode {
int val; // 节点值
ListNode* next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(nullptr) {} // 构造函数
};
```
然后,创建两个函数用于链表形式的加法和减法:
```cpp
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode dummy(0); // 创建虚拟头结点,简化边界处理
ListNode* cur = &dummy;
int carry = 0;
while (l1 != nullptr || l2 != nullptr || carry != 0) {
int sum = carry + (l1 ? l1->val : 0) + (l2 ? l2->val : 0);
carry = sum / 10;
cur->next = new ListNode(sum % 10);
cur = cur->next;
if (l1) l1 = l1->next;
if (l2) l2 = l2->next;
}
if (carry > 0) cur->next = new ListNode(carry); // 如果还有进位,添加一个新的节点
return dummy.next;
}
ListNode* subtractTwoNumbers(ListNode* minuend, ListNode* subtrahend) {
ListNode dummy(-1), *prev = &dummy; // 使用负一作为初始借位
ListNode* cur = &dummy;
bool borrow = false;
while (minuend && subtrahend) {
int diff = minuend->val - (subtrahend->val + borrow);
borrow = diff < 0;
prev->next = new ListNode(std::abs(diff));
cur = prev->next;
if (diff < 0) minuend = minuend->next;
else subtrahend = subtrahend->next;
}
while (minuend) {
int diff = minuend->val + borrow;
borrow = false;
prev->next = new ListNode(diff);
cur = prev->next;
minuend = minuend->next;
}
if (borrow) cur->next = new ListNode(-1); // 如果有借位,添加一个负一节点
return dummy.next;
}
```
注意,这只是一个基本的实现,对于真正的长整数计算,实际应用可能会需要更复杂的算法如Karatsuba算法等来提高效率。另外,上述代码假设了链表节点的构造函数接收一个int参数,并且删除节点的功能在这里并未涉及。
阅读全文