0

有 3 个链接列表,其中 2 个已按顺序排列。2 个链表被排序到 3rd( headZ) 中。如果我headZ像它一样作为指针传递,它会在函数退出时恢复为空列表。如果我通过引用传递,它会退出并且headZ只包含 1 个数字。我无法弄清楚如何让它工作。

void SortedRecur(Node*& headX, Node*& headY, Node* headZ){

if (headX == NULL && headY == NULL)
    return;

else if (headX == NULL && headY != NULL)
{
    if (headZ == 0)
    {
        headZ = headY;
        headY = headY->link;
        headZ->link = NULL;
    }
    else
    {
        headZ->link = headY;
        headY = headY->link;
        headZ = headZ->link;
        headZ->link = NULL;
    }
    SortedRecur(headX, headY, headZ);
}

else if (headX != NULL && headY == NULL)
{
    if (headZ == 0)
    {
        headZ = headX;
        headX = headX->link;
        headZ->link = NULL;
    }
    else
    {
        headZ->link = headX;
        headX = headX->link;
        headZ = headZ->link;
        headZ->link = NULL;
    }
    SortedRecur(headX, headY, headZ);
}

if (headX != NULL && headY != NULL)
{
    if (headX->data > headY->data)
    {
        if (headZ == NULL)
        {
            headZ = headY;
            headY = headY->link;
            headZ->link = NULL;
        }
        else
        {
            headZ->link = headY;
            headY = headY->link;
            headZ = headZ->link;
            headZ->link = NULL;
        }
    }
    else
    {
        if (headZ == NULL)
        {
            headZ = headX;
            headX = headX->link;
            headZ->link = NULL;
        }
        else
        {
            headZ->link = headX;
            headX = headX->link;
            headZ = headZ->link;
            headZ->link = NULL;
        }
    }
    SortedRecur(headX, headY, headZ);
}
cout << "ListZ: "; ShowAll(cout, headZ);} //Test contents of headZ
4

1 回答 1

0

如果不将 headZ 作为引用传递,则 headZ 指针在传递给此函数时不会更改。因此,例如,如果您执行以下操作:

Node* resultHead = NULL;
Node* inputA = GetInitialAList(); // (hypothetical function to get the inital value)
Node* inputB = GetInitialBList();
SortedRecur(inputA, inputB, resultHead);

那么 resultHead 的值将保持不变,因此它仍然是 NULL。另一方面,如果您将 SortedRecur 更改为以 headZ 作为参考,那么 headZ 的最终值将指向列表中的最后一个元素,因为每次添加新元素时您也会这样做headZ = headZ->link;- 所以 headZ 总是指向到列表的末尾。列表的开头丢失了。

我认为解决问题的最简单方法是保留当前的实现SortedRecur,而不是为 headZ 传递 NULL 指针,而是使用指向实际节点的初始值。这样,SortedRecur 可以将排序列表添加到 headZ 的末尾,并且初始 headZ 指针不变。例如,这是一种杂乱无章的方法:

Node dummyNode;
dummyNode.link = NULL;
Node* resultHead = &dummyNode;

Node* inputA = GetInitialAList(); // (hypothetical function to get the inital value)
Node* inputB = GetInitialBList();
SortedRecur(inputA, inputB, resultHead);
// At this point, the value of resultHead is unchanged,
// but the dummyNode now points to the sorted list.
// All we have to do now is discard the dummyNode.
resultHead = dummyNode.link;
于 2013-11-14T03:48:05.037 回答