链接列表重载添加

时间:2017-11-15 03:58:17

标签: c++ linked-list operator-overloading

我正在尝试使用链接列表重载添加并且已经碰壁了。我将2个链接列表添加到一起,每个节点单独添加,但如果我添加两个包含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;
}

1 个答案:

答案 0 :(得分:0)

从您的代码和帖子中,似乎每个链接列表都是数字的数字列表。您试图通过添加两个链接列表的匹配列表项来添加两个数字。但至少在两种情况下,这种情况会很快失败:

  1. 您添加的两个元素返回的总和大于10,它们位于数字的中间。在这种情况下,您需要携带一个",就像我们在二年级学到的那样。这将涉及一些你在这里没有的列表工作。
  2. 如果两个数字的长度不同。 while循环将忽略较长数字的额外数字。
  3. 是的它适用于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)
        ...
    }
    

    几个笔记:

    1. 您可能需要更改while条件以使用不同长度的数字,并处理任何最终进位。
    2. 这只适用于汇总2个数字。对于3个或更多,您必须处理int thisDigitVal = sum % 10 + carryVal;返回值>的情况。 9然后在下一个数字的进位中添加另外1个。