调用printList时,以下代码会导致分段错误。为什么会这样?
故障的一个工作示例位于https://ide.geeksforgeeks.org/ZeqrQf9esb
#include <iostream>
struct Node {
int data;
Node * next;
Node * prev;
};
void addNode(struct Node **head_ref,int pos,int data)
{
struct Node*nn=new Node;
int k=0;
nn->data=data;
if(*head_ref==nullptr)
*head_ref=nn;
else
{
struct Node*temp=*head_ref;
while(k<pos)
{
temp=temp->next;
}
if(temp->next!=nullptr)
{
nn->prev=temp;
nn->next=temp->next;
temp->next=nn;
nn->next->prev=nn;
}
else
{
nn->next=nullptr;
nn->prev=temp;
temp->next=nn;
}
}
}
void printList(struct Node *Node)
{
struct Node *temp=Node;
//goto end
while(temp->next!=NULL)
{
temp=temp->next;
}
//goto start
while(temp->prev!=NULL)
{
temp = temp->prev;
}
//now print
while(temp!=NULL)
{
printf("%d ",temp->data);
temp=temp->next;
}
}
int main()
{
Node * head;
addNode(&head,0,10);
addNode(&head,0,11);
addNode(&head,0,12);
std::cerr << head->data << std::endl;
std::cerr << head->next->data << std::endl;
std::cerr << head->next->next-> data << std::endl;
printList(head);
}
1(不要在同一代码中混合malloc和new。您将无法跟踪哪些节点来自哪个分配器,如果您释放了来自new的内容,或者删除了来自malloc的内容,则会出现严重的错误。
2( 同时推进"k"次。。。你忘记了增加k,所以永远不要停止前进,离开你的列表。这是崩溃的来源:
while(k<pos)
{
temp=temp->next;
}
可能还有更多,但我看到#2后就不再看了。
修复方法是将next和prev初始化为null。如果你不这样做,那么它们会取随机值。重要的线路是
struct Node {
int data;
Node * next=nullptr;
Node * prev=nullptr;
};
请参阅https://wandbox.org/permlink/qooehizoRifrvOVX作为一个工作示例。以下的完整代码
#include <iostream>
struct Node {
int data;
Node * next=nullptr;
Node * prev=nullptr;
};
void addNode(struct Node **head_ref,int pos,int data)
{
struct Node*nn=new Node;
int k=0;
nn->data=data;
if(*head_ref==nullptr)
*head_ref=nn;
else
{
struct Node*temp=*head_ref;
while(k<pos)
{
temp=temp->next;
}
if(temp->next!=nullptr)
{
nn->prev=temp;
nn->next=temp->next;
temp->next=nn;
nn->next->prev=nn;
}
else
{
nn->next=nullptr;
nn->prev=temp;
temp->next=nn;
}
}
}
void printList(struct Node *Node)
{
struct Node *temp=Node;
//goto end
while(temp->next!=nullptr)
{
temp=temp->next;
}
//goto start
while(temp->prev!=nullptr)
{
temp = temp->prev;
}
//now print
while(temp!=nullptr)
{
printf("%d ",temp->data);
temp=temp->next;
}
}
int main()
{
Node * head;
addNode(&head,0,10);
addNode(&head,0,11);
addNode(&head,0,12);
std::cerr << head->data << std::endl;
std::cerr << head->next->data << std::endl;
std::cerr << head->next->next-> data << std::endl;
printList(head);
}