C++指针恢复

C++ pointers reverting back

本文关键字:恢复 指针 C++      更新时间:2023-10-16

有 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

如果不传递 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;