2014-07-12 2 views
0

Я пытаюсь вставить данные в двойной связанный список после указанных данных и отображает ошибку сегмента.Ошибка сегментации при проверке данных указателя

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; 
} 

Понятия не имею, почему ошибка в то время (TEMP-> данные! = Data1) .Отель структура используется общий для двойных связанных списков.

+0

Можно дойти до конца списка и не имеет 'данных = 25', поэтому' temp' получает назначение NULL (тем более, что вы никогда не проверяете значение «temp»). Segfault прибудет, если вы попытаетесь его использовать. – AntonH

+0

Возможно, вы захотите взглянуть на https://github.com/raymontag/Linked-Lists-in-C. Я написал это давным-давно, и мои знания C были не очень хорошими, но они работают и могут помочь вам , –

ответ

2

Так вот некоторые общие мысли:

  1. Вы выделяете память для temp, а затем быстро просачиваться его.

  2. В вашем цикле while, если вы никогда не найдетеdata1?

    Тогда для некоторого узла, temp->next == NULL, так, то вы будете назначать NULL к temp, и тогда вы будете пытаться разыменовать temp, обеспечивая неисправность.

  3. WhozCraig noted another location for a fault. Что произойдет, если *head == NULL. То есть, вы начинаете с пустого списка? В этом случае вы сразу же назначаете temp = NULL, а затем вы вскоре попытаетесь разыменовать temp, гарантируя ошибку.

+0

Нет, я удалил выделение для temp. Но это вряд ли имеет значение. Как я его утечка, если я выделяю для него память? – Paku

+3

'temp = (struct node *) malloc (sizeof (struct node));' follow by 'temp = * head;' –

+0

ok i remove it.Then снова он показывает ту же ошибку в цикле while. – Paku

0

Аварийная ситуация случается, если данные1 не найдены. Некоторые случаи не обрабатываются должным образом, измените логику, как показано ниже, которая решит проблему.

//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;

Смежные вопросы