2016-12-01 47 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;} 

這似乎是做工精細,因爲我可以重新訪問每個節點的數據,如果我嘗試打印這個功能裏面。 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和新的由自己管理的內存分配。

乾杯!

+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