链表重载添加
Linked List overload addition
我试图使用链表重载加法,但遇到了麻烦。我将两个链表添加在一起,每个节点都是单独添加的,但如果我添加两个包含999和999的列表,那么它显示的是181818,而不是正确的答案,我有点迷路了。它有时似乎有效,尽管我用500和500。
LinkedList LinkedList::operator+( LinkedList &obj)
{
LinkedList sum;
ListNode *nodePtr;
ListNode *nodePtr2;
nodePtr = head;
nodePtr2 = obj.head;
while (nodePtr && nodePtr2)
{
sum.appendNode(nodePtr->value + nodePtr2->value);//append node adds a new node containing the value at the end of the list.
nodePtr = nodePtr->next;
nodePtr2 = nodePtr2->next;
}
return sum;
}
从您的代码和文章中,每个链表似乎都是一个数字的数字列表。您正试图通过添加两个链表的匹配列表项来添加两个数字。但这至少在两种情况下会很快失败:
- 添加的两个元素返回的总和大于10,并且它们位于数字的中间。在这种情况下,你需要"背着一个",正如我们在二年级学到的那样。这将涉及到更多你在这里没有的列表工作
- 如果这两个数字的长度不同。while循环将忽略较长数字的额外数字
是的,它适用于500+500——这并不违反我上面提到的两种情况中的任何一种。
所以,我想把你的while
循环改成这样:
int carryVal = 0;
while (...) {
...
int sum = nodePtr->value + nodePtr2->value;
int thisDigitVal = sum % 10 + carryVal; // First digit of the sum, plus any carry from previous digit
sum.appendNode(thisDigitVal);
carryVal = sum / 10; // carry for next digit (division by int will truncate -- thats what we want)
...
}
注意事项:
- 您可能需要更改
while
条件,以处理不同长度的数字,并处理任何最终进位 - 这只适用于对2个数字求和。对于3或更多,您将不得不处理
int thisDigitVal = sum % 10 + carryVal;
返回值>9的情况,从而在下一个数字的进位上再加1
相关文章:
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 运算符重载使用运算符+添加类模板
- 重载运算符与添加问题
- 运算符重载 += 添加新对象
- C++ 尝试将>>运算符重载添加到模板
- oStream 不打印添加两个 valarray 的结果(使用运算符重载)
- 添加重载更改选择的重载
- 重载加法运算符(使用函数向对象添加字符串)
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- C++将带有重载构造函数的对象添加到另一个对象
- 赋值和添加运算符重载(2个表和int的串联)
- 如何重载运算符+= 要增加动态数组大小,请在末尾添加一个对象
- 重载运算符+以添加存储在向量中的类对象
- 使用运算符重载添加存储在 vector 中的类对象
- 重载 + 运算符以使用 int 添加对象
- 通过使用具有私有数据成员的类重载 + 运算符来添加分数
- 为什么我的重载运算符+在向自身添加变量时会在返回时使"this"未初始化?
- 如何阻止此添加重载更改参数的值?