2017-05-11 39 views
1

最後一個printf調用(printf(「%d \ n」,current-> val);)將不會被執行。第一個printf函數的結果出現後,我得到錯誤「program.exe已停止工作」。我希望得到一些幫助。帶鏈接列表的內存處理錯誤

#include <stdio.h> 

typedef struct node 
{ 
    int val; 
    struct node * next; 
} node_t; 

void print_list(node_t * head); 

void main() 
{ 
    node_t * head = NULL; 
    head = malloc(sizeof(node_t)); 
    if (head == NULL) 
     return 1; 
    head->val = 3; 
    head->next = malloc(sizeof(node_t)); 
    head->next->val = 2; 
    head->next->next = malloc(sizeof(node_t)); 
    head->next->next->val = 3; 
    head->next->next->next = malloc(sizeof(node_t)); 
    head->next->next->next->val = 18; 

    print_list(head); 

    head->next->next->next->next = malloc(sizeof(node_t)); 
    head->next->next->next->next->val = 5556; 
    head->next->next->next->next->next = NULL; 
    node_t * current = head; 
    while (current->next != NULL) 
    { 
     current = current->next; 
    } 
    current->next = malloc(sizeof(node_t)); 
    current->next->val = 32; 
    current->next->next = NULL; 
    printf("%d", current->next->val); 
    system("pause"); 
} 

void print_list(node_t * head) { 
    node_t * current = head; 

    while (current != NULL) { 
     printf("%d\n", current->val); 
     current = current->next; 
    } 
} 
+0

你確定print_list可以工作嗎?自print_list被調用時,最後一個節點不會指向null。所以,打印邏輯可能會失敗。 –

+0

使用節點插入和刪除功能。這樣做是管理鏈表的追求方式。 – sjsam

+0

謝謝你的提示,夥計們!問題解決了。 – Leet

回答

2

這將不順利:

head->next->next->next = malloc(sizeof(node_t)); 
head->next->next->next->val = 18; 

print_list(head); 

你永遠不會初始化head->next->next->next->next爲NULL。而應使用calloc,或者將該值顯式設置爲NULL。更好的是,編寫一個函數來創建一個新節點,以便永遠不會忘記初始化。更好的是,編寫一個插入節點的函數。

什麼是這樣的:

node_t * create_node(int val) { 
    node_t *node = malloc(sizeof(*node)); 
    if(node) { 
     node->val = val; 
     node->next = NULL; 
    } 
    return node; 
} 

node_t * insert_value(node_t *list, int value) { 
    node_t *new_node = create_node(value); 
    if(!new_node) { 
     return list; 
    } else if(list) { 
     new_node->next = list->next; 
     list->next = new_node; 
    } 
    return new_node; 
} 

然後,您可以:

node_t *head = insert_value(NULL, 3); 
node_t *tail = head; 
tail = insert_value(tail, 2); 
tail = insert_value(tail, 3); 
tail = insert_value(tail, 18); 
print_list(head); 

對列表的常用方法是使用一個虛擬頭節點,你永遠不會打印出來。它只包含一個next指針,它是您列表的開始,並且您忽略該值。如果你這樣做了,那麼你也可以使用該函數在列表的第一個元素之前插入一個值。您還可以獲得以下好處:head總是管理您的整個列表,您永遠不必擔心它發生變化。

+0

謝謝!儘管這很簡單,但如果有的話,這將花費我太多的時間來解決它! – Leet