递归中的双指针是必需的

时间:2014-09-20 05:34:09

标签: c++ pointers recursion data-structures

如果我想在链表中添加Node,为什么递归需要双指针。它应该与单指针一起使用。

以下代码对我不起作用

class LinkedList
{
private:
    struct Node
    {
        int data;
        Node* link;
    }*Ptr;
public:
    LinkedList()
    {
        Ptr = NULL;
    }

    void Add(int num)
    {
        /*Add(&Ptr, num);*/
        Add(Ptr, num);
    }

    void Add(Node* Ptr, int num)
    {
        Node* tmp = NULL;

        if (Ptr == NULL)
        {
            tmp = new Node;
            tmp->data = num;
            tmp->link = NULL;
            Ptr = tmp;
        }
        else
        {
            Add(Ptr->link, num);
        }
    }

    void Display()
    {
        Node *tmp;
        tmp = Ptr;

        while (tmp != NULL)
        {
            cout <<tmp->data << endl;
            tmp = tmp->link;
        }
    }
}


int main() {

LinkedList l;

    l.Add(10);
    l.Add(20);
    l.Add(30);
    l.Add(40);
    l.Add(50);

    l.Display();

    _getch();
    return 0;

}

2 个答案:

答案 0 :(得分:3)

A&#34;双指针&#34;是必需的,因为您正在更改函数中指针的值。

甚至没有看你的代码,看看这个非常简单的例子:

void foo(int *x)
{
   x = new int[10];
}

int main()
{
   int *p = 0;
   foo(p);
   // why is p still NULL?
}

您会看到p的值没有变化,即使该函数显然更改了传递的参数。问题是x是一个临时变量,一旦函数退出,对x的任何更改都会消失。

要解决此问题,您必须传递指针指针或指针的引用:

void foo(int** x)
{
    *x = new int[10];
}

void foo2(int *& x)
{
    x = new int[10];
}

int main()
{
    int *p = 0;
    foo(&p);  // now p will change
    delete [] p;

    p = 0;  // try again
    foo2( p );  // p also changes here
    delete [] p;
}

答案 1 :(得分:0)

当我遇到指针问题时(以前做过什么),我要做的就是绘制它,(特别是链接列表)... 我没有运行代码,但我不完全可以给你的班级打电话1 ... 第二,看起来你的列表指针始终位于列表的最后一个元素中...... 因此,如果它运行,它将读取的唯一元素是最后一个... 尝试使用调试器并查看添加过程或显示...