我尝试在指定数据之后在双链表中插入数据,并显示段错误。
void dllinsertafter(struct node **head,int data,int data1)
{
struct node *temp,*newnode;
newnode=(struct node*)malloc(sizeof(struct node));
newnode->data=data;
temp=*head;
while ((temp->data)!=data1)
temp=temp->next;
newnode->next=temp->next;
temp->next->prev=newnode;
newnode->prev=temp;
temp->next=newnode;
}
不知道为什么错误在while(temp-> data!= data1)。使用的结构对于双链表是常见的。
答案 0 :(得分:2)
所以这里有一些通用的想法:
您为temp
分配内存,然后立即泄漏。
在你的while循环中,如果你永远不会找到 data1
会怎样?
然后对于某个节点temp->next == NULL
,那么您将NULL
分配给temp
,然后您将尝试取消引用temp
,以确保出现错误。
WhozCraig noted another location for a fault。如果*head == NULL
会发生什么。也就是说,你从一个空列表开始?在这种情况下,您将立即分配temp = NULL
,然后您很快就会尝试取消引用temp
,以确保出现错误。
答案 1 :(得分:0)
如果找不到data1,则会发生崩溃。有些情况处理不当,改变下面的逻辑,这将解决崩溃。
//check to prevent the crash if list is empty
if (*head == NULL)
{
*head = newnode;
newnode->previous = newnode->next = NULL;
}
else
{
temp=*head;
while(temp != NULL)
{
if((temp->data)==data1)break;
temp=temp->next;
}
newnode->next=temp->next;
//check to prevent the crash if data1 is last element
if (temp->next != NULL)
{
temp->next->prev=newnode;
}
newnode->prev=temp;
temp->next=newnode;
}
temp=(struct node*)malloc(sizeof(struct node));
- 不需要此内存分配,这会在temp=*head;
泄露