2013-09-12 7 views
3

Я пытаюсь вставить элементы в свой двойной связанный список в зависимости от количества узлов n. Например, если n - 4, тогда количество введенных элементов: 34 45 32 1, но получение segmentation fault. Может ли кто-нибудь сказать мне, где я ошибаюсь?Неожиданная ошибка в двойном связанном списке в C

#include<stdio.h> 
#include<malloc.h> 

struct node{ 
      struct node *prev; 
      struct node *next; 
      int info; 
      }*start; 

create_list(int num) 
{ 
printf("Hi I entered!\n"); 
struct node *q,*tmp; 
tmp= malloc(sizeof(struct node)); 
tmp->info=num; 
tmp->next=NULL; 

if(start==NULL) 
{ 
    printf("Hi I am null!\n"); 
    tmp->prev=NULL; 
    start->prev=tmp; 
    start=tmp; 
} 

else 
{ 
    printf("Hi I am no more null!\n"); 
    q=start; 
    while(q->next!=NULL) 
    q=q->next; 
    q->next=tmp; 
    tmp->prev=q; 
    } 
} 




int main(){ 

int choice, n, elem,i; 
start = NULL; 

printf("Enter your choice of number: \n"); 
scanf("%d", &choice); 

while(1) 
     { 

switch(choice) 
{ 
    case 1: 
    printf("Enter the number of nodes: \n"); 
    scanf("%d", &n); 

    for(i=0; i<n; i++) 
    { 
     printf("Enter the elemnts: \n"); 
     scanf("%d", &elem); 
     create_list(elem); 
    } 
    break; 

default: 
     printf("You have tyoed wrong!\n"); 
    } 

    } 
} 

ответ

3
if(start==NULL) 
{ 
    ... 
    start->prev=tmp; 

Если start является NULL, то задание выше неверно.

Я хотел бы предложить инициализацией prev в NULL, когда вы размещаете новый узел, как это:

tmp= malloc(sizeof(struct node)); 
tmp->info=num; 
tmp->next=NULL; 
tmp->prev=NULL;  // add this 

if(start==NULL) 
{ 
    printf("Hi I am null!\n"); 
    start=tmp; 
} 
.... 
3

Вы пытаетесь разыменования указателя NULL здесь:

if(start==NULL) 
{ 
    printf("Hi I am null!\n"); 
    tmp->prev=NULL; 
    start->prev=tmp; //start is NULL 

Поскольку указатель на структуру start делает не указывать на какую-либо память, вы не можете использовать ее для обработки данных.

+0

Какое должно быть назначение? – user227666

+0

@ user227666 Вы должны указать начало действительной части памяти. 'start = malloc()' будет запущен. – this

1

У вас бесконечный цикл while. Установите некоторую переменную после того, как вы закончите вставлять ее в список. проверьте эту переменную после выхода из корпуса коммутатора и снова перерыв из цикла while.

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