2016-02-01 5 views
0

Я пытаюсь изучить методы вставки в Связанный список. Во время выполнения он сбрасывает каждый раз, говоря, что программа перестала работать. Он не обнаружил никаких ошибок. Я новичок в Stack Overflow. Так что простите меня, если этот вопрос уже задан. Вот мой код:Почему моя программа рушится каждый раз, когда я запускаю ее?

#include<stdio.h> 
    #include<stdlib.h> 

    struct node{ 
    int data; 
    struct node *next; 
    }; 

    void push(struct node** head_ref, int new_data) 
    { 
    struct node* new_node= (struct node*)malloc(sizeof(struct node)); 
    new_node->data=new_data; 
    new_node->next=(*head_ref); 
    (*head_ref)=new_node; 
    } 
    void insertAfter(struct node* prev_node, int new_data) 
    { 
    if(prev_node==NULL) 
    {printf("The previous node cannot be NULL"); 
     return; 
    } 
    struct node* new_node=(struct node*)malloc(sizeof(struct node)); 
    new_node->data=new_data; 
    new_node->next=prev_node->next; 
    prev_node->next=new_node; 

    } 

    void append(struct node** head_ref, int new_data) 
    { 
    struct node* new_node= (struct node*)malloc(sizeof(struct node)); 
    struct node *last= *head_ref; 
    new_node->data=new_data; 
    new_node->next=NULL; 
    if(*head_ref==NULL) 
    { 
     *head_ref=new_node; 
    } 
    else 
     while(last->next!=NULL) 
    { 
     last=last->next; /* Segmentation fault */ 
    } 
    last->next=new_node; 
    return; 
    } 

     void printlist(struct node *node) 
    { 
     while(node!=NULL) 
    { 
     printf("%d",node->data); 
     node=node->next; 
    } 

    } 
    int main() 
    { 
    struct node* head=NULL; 
    append(&head,6); 
    push(&head,7); 
    push(&head,11); 
    append(&head,4); 
insertAfter(head->next,12); 
printf("\n Created Linked list is:"); 
printlist(head); 
    return 0; 
    } 
+2

Используйте отладчик, сначала сузите оскорбительную инструкцию. –

+0

Ну, теперь он сказал что-то о недостатке сегментации. Как вы это исправите? (Извините, я до сих пор не знаком с программированием) –

+2

Также некоторые форматирование вашего кода не пойдет не так. –

ответ

0

По крайней мере, вы пытаетесь разыменования NULL указателя (в append).

Возможно, вы захотите if (head_ref==NULL) вместо if (*head_ref==NULL).

2

Вы проверяете корпус, где находится голова NULL, но предложение else содержит только петлю while. Назначение last выполняется в обоих случаях.

Вы должны поместить скобки вокруг пункта else:

void append(struct node **head_ref, int new_data) 
    { 
     struct node *new_node = (struct node *) malloc(sizeof(struct node)); 
     struct node *last = *head_ref; 

     new_node->data = new_data; 
     new_node->next = NULL; 

     if (*head_ref == NULL) { 
      *head_ref = new_node; 
     } else { 
      while (last->next != NULL) { 
       last = last->next; 
      } 
      last->next = new_node; 
     } 
    } 

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

+0

Правильный отступ и использование брекетов FTW. (и некоторые пробелы никого не убивали) –

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