2016-05-30 83 views
-3

我想在C中構建自己的LinkedList幾個小時了,而我只是無法使它正常工作。請指出該代碼出錯的地方和原因。爲實際行爲向下滾動到「主」。C LinkedList將無法正常工作

struct List { 
    struct Node * head; 
} list; 

struct Node { 
    int data; 
    struct Node * next; 
} node; 

void 
add(struct List* list, int z){ 

    //add as first element 
    if(list -> head == NULL){ 
    list -> head = malloc(sizeof(struct Node)); 
    (list -> head) -> data = z; 
    (list -> head) -> next = NULL; 
    return; 
    } 

    //add to tail 
    struct Node * curr = list -> head; 

    while((curr -> next) != NULL){ 
    curr = curr -> next; 
    } 

    list -> head = malloc(sizeof(struct Node)); 
    (list -> head) -> data = z; 
    (list -> head) -> next = NULL; 
    return; 
} 

void 
printNode(struct Node * node){ 

    if(node == NULL){ 
    printf("NULL\n"); 
    return; 
    } 

    printf("%d -> ", node->data); 
    printNode(node->next); 

} 

void 
printList(struct List * list){ 
    if(list->head == NULL) 
    printf("empty\n"); 
    else 
    printNode(list->head); 
} 

出於某種原因,'add'確實會改變傳遞的List,使得只有最後一個元素保留在那裏。我已經多次重寫了程序 - 遞歸和迭代 - 結果似乎總是這樣。

int 
main(){ 

    struct List myList; 
    myList.head = NULL; 

    printList(&myList); // empty 
    add(&myList, 1); 
    printList(&myList); // 1 -> NULL 
    add(&myList, 2); 
    printList(&myList); // 2 -> NULL, should be 1 -> 2 -> NULL 
    add(&myList, 3); 
    printList(&myList); // 3 -> NULL, should be 1 -> 2 -> 3 -> NULL 
    add(&myList, 4); 
    printList(&myList); // 4 -> NULL, should be 1 -> 2 -> 3 -> 4 -> NULL 
} 

我甚至重新在其他語言中的程序,看是否有在任何程序邏輯突破性的缺陷,但在其他地方我得到了它馬上工作。

+0

只要採取在一張紙上,寫列,用於'添加(每一個變量)',然後寫行對代碼在'添加)的每一行('。每個步驟中每個變量的值是多少?你會很快看到。 –

+0

約翰內斯的回答是正確的,但是你的程序也是非常低效的。您應該將新元素添加到列表的開頭,或將指針存儲在List結構中的最後一個節點。這是列表的重點。 – user31264

+1

調試器.......................... –

回答

1

在你的計劃,你要搜索的最後一個元素:

while((curr -> next) != NULL){ 
    curr = curr -> next; 
} 

這個的正確,但此時你改變了頭:

list -> head = malloc(sizeof(struct Node)); 
(list -> head) -> data = z; 
(list -> head) -> next = NULL; 

相反,你應該創建一個新元素並更改當前指針的next指針:

struct Node *new_data = malloc(sizeof(struct Node)); 
new_node -> data = z; 
new_node -> next = NULL; 
curr -> next = new_node; 
+0

哦,你當然是絕對正確的。現在我感覺非常愚蠢,沒有發現那個錯誤。 – nitowa

1

它的種類l ooks喜歡你需要決定是否要添加到頭部或尾部...它看起來像你試圖添加到頭部,但然後你會使下一個電流,而不是零...

list -> head = malloc(sizeof(struct Node)); 
(list -> head) -> data = z; 
(list -> head) -> next = NULL; // HERE <-- next is NULL 

而非:

list -> head = malloc(sizeof(struct Node)); 
(list -> head) -> data = z; 
(list -> head) -> next = curr;