我通常不会发出一个问题,问一下代码有什么问题,但我有点困惑,并且没有看到下面的函数失败的原因。
我正在编写一个反转链表的函数。第一个函数ReverseList1()导致运行时错误,并在使用驱动程序代码main()进行测试时崩溃。
第二个函数ReverseList2(),使用指向指针的指针作为head参数正常工作。为什么,它仍然指向相同的数据?也许我错过了一些明显和关键的东西,但我看不到它。提前谢谢。
////第一个功能/////
void ReverseList1(struct Node* head, struct Node* prev, struct Node* next)
{
// not valid list
if (head == NULL)
{
return;
}
struct Node* cur = head;
while(cur != NULL)
{
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
head = prev;
}
////////第二个功能 - 使用此////
时不会崩溃void ReverseList2(struct Node** head, struct Node* prev, struct Node* next)
{
// not valid list
if (head == NULL)
{
return;
}
struct Node* cur = *head;
while(cur != NULL)
{
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
*head = prev;
}
//////要测试的驱动程序代码//////
int main()
{
struct Node* head= new struct Node;
head->data = 1;
head->next = new struct Node;
head->next->data = 2;
head->next->next = new struct Node;
head->next->next->data = 3;
head->next->next->next = new struct Node;
head->next->next->next->data = 4;
head->next->next->next->next = NULL;
//ReverseList1(head, NULL, NULL); // Runtime error
ReverseList2(&head, NULL, NULL)
cout<<head->data<<endl;
cout<<head->next->data<<endl;
cout<<head->next->next->data<<endl;
cout<<head->next->next->next->data<<endl;
return 0;
}
答案 0 :(得分:1)
使用指向指针而不是head参数正常工作。为什么,它仍然指向相同的数据
不,它没有指向相同的数据。指针指向节点。指向指针的指针指向指向节点的指针。
当您为函数指定本地的指针变量时,它对函数外部的任何变量都没有影响。通过不将不是局部变量的头指针更新到函数,算法的实现是不完整的。
当您取消引用指向不是局部变量的对象的指针时,分配该解除引用的对象确实会对该对象产生影响。