2016-12-01 2 views
0

У меня есть двойной связанный список на C, в узлах которого есть char *. Моя структура для узла выглядит следующим образом:Программа вылетает при печати LinkedList

struct LinkedListNode{ 
char* data; 
LinkedListNode* next; 
LinkedListNode* prev; }; 

структура для LinkedList выглядит следующим образом:

struct LinkedList{ 
LinkedListNode* head; 
LinkedListNode* tail;}; 

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

LinkedList* make_test_list(){ 
LinkedList* newlist = LinkedList_create(); 
printf("Hier2"); 
LinkedListNode n1; 
LinkedListNode n2; 
LinkedListNode n3; 
LinkedListNode n4; 
LinkedListNode n5; 
n1.data = "abc"; 
n2.data = "def"; 
n3.data = "ghi"; 
n4.data = "pqr"; 
n5.data = "mno"; 
n1.next = &n2; 
n2.next = &n3; 
n2.prev = &n1; 
n3.next = &n4; 
n3.prev = &n2; 
n4.next = &n5; 
n4.prev = &n3; 
n5.prev = &n4; 
n5.next = NULL; 
newlist->head = &n1; 
newlist->tail = &n5; 
return newlist;} 

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

LinkedList* LinkedList_create(){ 
LinkedList* list = malloc(sizeof(struct LinkedList)); 
list->head = NULL; 
list->tail = NULL; 
return list; 
} 

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

void LinkedList_print(LinkedList* list){  
LinkedListNode* p = list->head; 
while(p != NULL)){ 
    printf("%s\n", p->data); 
    p = p->next; 
}} 

Но почему-то не работает. Я думаю, что я ошибся, назначив свои указатели. Вызов выглядит следующим образом:

int main(){ 
LinkedList* myList = make_test_list(); 
printf("List before: \n"); 

LinkedList_print(myList); 
} 

Я был бы рад, если бы вы могли бы помочь мне в этом, так как я совершенно новой для C и новым для управления распределением памяти самостоятельно.

Cheers!

+0

Просьба показать [mcve]. Не описывайте свой код, покажите его. –

ответ

1

Ваши LinkedListNode переменные (n1 - n5) являются локальными по отношению к функции make_test_list. Вам необходимо выделить для них память, если вы хотите получить к ним доступ за пределами этой функции.

Например:

LinkedListNode *n1 = malloc(sizeof(*n1)); 
n1->data = "abc"; 
... 
newlist->head = n1; 
... 

Конечно, вы также хотите, чтобы убедиться, что вы free память позже. Я также делаю предположение, что LinkedList_create реализовано правильно, так как здесь не показано.

+0

Ты, сэр, мой герой! – Yannickl96

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