如果我想在链表中添加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;
}
答案 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 ... 第二,看起来你的列表指针始终位于列表的最后一个元素中...... 因此,如果它运行,它将读取的唯一元素是最后一个... 尝试使用调试器并查看添加过程或显示...