[英]What causes the segmentation fault in the doubly linked list code
調用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。 您將失去對哪個節點來自哪個分配器的跟蹤,如果您釋放了新分配的節點,或者刪除了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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.