2016-05-10 64 views
0

我一般無法理解鏈接列表。我明白他們是如何在紙面上工作的,但是一旦我開始編寫它們,我似乎從未做過任何事情。添加到C中的鏈接列表的前面

這裏是我的代碼:

頭文件:

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

typedef struct List { 

    int data; 
    struct List * next; 
} List; 

實現文件:

#include "test.h" 

void addToFront(int data, List * head); 

int main(void) { 
    List * list; 
    list = malloc(sizeof(List)); 
    list->next = NULL; 

    List * head; 
    head = NULL; 

    addToFront(5,head); 

    printf("%d",head->data); //print first element 
    printf("%d",list->data); //print first element 

} 

void addToFront(int data, List * head) { 
    if(head == NULL) { 
     List * newNode = malloc(sizeof(List)); 
     newNode->data = data; 
     head = newNode; 
    } 
    else { 
     List * newNode = malloc(sizeof(List)); 
     newNode->data = data; 
     newNode->next = head; 
     head = newNode; 
    } 

} 

我知道,對於一個鏈表是空的,標題是NULL,所以我有檢查那裏。問題出現了,因爲我得到一個段落錯誤,說頭沒有初始化,顯然不是,如果我初始化,我不能跟蹤列表是否爲空,因此使用頭節點。

我現在能做什麼?我不想使用雙指針,至於我的課程,目前爲止還沒有其他人使用它們(請不要讓我使用雙指針),並且我完全不知道如何在此處繼續。

我在想沒有頭節點的情況下嘗試。因此,我可以有一個跟蹤列表中的項目的計數器,檢查它是否爲零,然後將基本元素添加到前面,否則在我的else語句中執行相同的操作?

回答

0

的問題是在你的addFront功能,你只有指針傳遞到頭部,爲了改變一下頭指向你需要通過頭部的地址:

void addToFront(int data, List ** head) 

然後

*head = newHead 

當您只傳遞指針時,您只是將指針的副本傳遞給該函數,因此一旦您離開函數作用域,對函數內部指針的任何更改都將丟失。

在概念上類似:

void f(int n) 
{ 
    n = 53; 
} 

爲了避免雙指針就可以返回新掌門人:

List* addToFront(int data, List* head) 
{ 
    ... 
    return newNode; 
} 

... 

head = addToFront(data, head); 

... 
+0

而且有沒有辦法避免使用雙指針,當使用鏈接列表? – efefe

+1

而不是使用雙指針,你可以返回指針,這樣你就可以改變它。例如'List * addToFront(int data,List * head);' –

+0

您可以擁有一個包含頭部,尾部和大小的結構。所以當你傳遞一個指針時,內部指針的修改將會有效。 (假設這個結構名稱將是List,並且你當前的List結構被重命名爲ListNode) – Tezirg

0

如果你不想使用雙指針,可以使用標頭節點作爲一個哨兵節點,它僅充當佔位符,因此第一個元素通過head->next鏈接,並檢查列表是否爲空,請檢查head->next == NULL。試試這個:

int main(void) { 
    List *head = malloc(sizeof(List)); 
    head->data = 0; 
    head->next = NULL; 

    addToFront(5, head); 

    List *first = head->next; 
    if (first) { // safe guard for first element 
     printf("%d", first->data); //print first element 
     printf("%d", first->data); //print first element 
    } 
} 

void addToFront(int data, List * head) { 
    List * newNode = malloc(sizeof(List)); 
    newNode->data = data; 
    newNode->next = head->next; 
    head->next = newNode; 
}