2015-02-10 3 views
0

вот мой код в C для создания связанного списка. Его выдача ошибки во время выполнения после цикла while выполняется один раз. Plz помогите мне в исправлении моего кода. (полностью путают, что где ошибка.) Сначала я делаю узел головы, а затем добавляю к нему дочерние узлы.Создание связанного списка по головам и узлу

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

typedef struct node nd; 
typedef nd *link; 

struct node{ 
    int data; 
    link next; 
}; 

typedef struct { 
    int size; 
    link head; 
}list; 

void create(link temp) 
{ 
    link new; 
    new=(link)malloc(sizeof(nd)); 
    printf("enter data: "); 
    scanf("%d",new->data); 
    temp->next=new; 
    temp=temp->next; 
} 

list createlist() 
{ 
    list sl; 
    sl.size=0; 
    sl.head=0; 
    return sl; 
} 

int main() 
{ 
    list sl; 
    sl=createlist(); 
    link temp; 
    temp=sl.head; 
    char c; 
    while (1) 
    { 
     printf("Add node?: "); 
     scanf(" %c",&c); 
     if (c=='y') 
      { 
      create(temp); 
      sl.size++; 
      } 
     else 
      break; 
    } 
    return 0; 
} 
+0

На какой линии он падает? Какой вклад вы даете? –

+1

Было бы полезно изменить переменную 'new' в create() на что-то еще. Это не твоя проблема, просто плохой стиль. – KeithSmith

+0

Не следует сканировать f ("% d", new-> data); be scanf ("% d", & new-> data); – KeithSmith

ответ

2

ваша createlist() функция возвращает ссылку на локальную переменную, которая выходит за рамки после того, как возвращается. Вместо этого вы должны вернуть значение на основе кучи:

list* createlist() { 
    list* sl = (list*)malloc(sizeof(list)); 
    sl->size=0; 
    sl->head=0; 
    return sl; 
    } 
0

Первоначально температура указывает на NULL. temp = sl.head;

В создании (темп) temp-> next = new;

Вы разыскиваете NULL, адрес 0x0. Когда я это делаю, возникает ошибка сегментации.

Необходимо изменить алгоритм. Отладчик немедленно показывает эту проблему.

0

Вы можете использовать указатель на указатель для temp. Было бы легче прочитать, если бы вы не использовали typedef для указателя на узел. Я не тестировал это, но он должен быть близок:

nd ** create(nd **temp) 
{ 
    nd *new; 
    new=(nd *)malloc(sizeof(nd)); /* this cast shouldn't be needed */ 
    printf("enter data: "); 
    scanf("%d",&(new->data)); 
    new->next = NULL; 
    *temp = new; 
    return &(new->next); 
} 
/* ... */ 

int main() 
{ 
nd **temp; 
temp = &(sl.head); 
/* ... */ 
     temp = create(temp); 
/* ... */ 
} 
Смежные вопросы