2011-05-05 26 views
0

我剛剛開始學習C,和(看似)到目前爲止大多數的東西是點擊。不過,我在嘗試雙鏈表時遇到了一些問題。當我嘗試構建/運行此代碼時,我不斷收到seg-fault。我正在使用Cygwin通過NetBeans提供的gcc進行編譯。雙鏈表;新手嘗試

我不想只轉儲的代碼塊,並說「幫助」,但我不知道還有什麼其他細節相關的在這個時候,可以隨意在必要時詢問詳情:

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

struct node_t{ 
    struct node_t *prev; 
    struct node_t *next; 
}; 

struct list_t{ 
    struct node_t *head; 
    struct node_t *tail; 
    int length; 
}; 

struct node_t *new_node(void); 
struct list_t *new_list(void); 
int append_list_node(struct list_t *list, struct node_t *node); 

int main(void) { 

    int i = 0, length = 0; 
    struct node_t *node; 
    struct list_t *list = new_list(); 

    for(i = 0; i < 10; i++){ 
     length = append_list_node(list, new_node()); 
     printf("%d", length); 
    } 

    return 0; 

} 

struct node_t *new_node(void){ 
    struct node_t *node = malloc(sizeof(struct node_t)); 
    return node; 
} 

struct list_t *new_list(void){ 
    struct list_t *list = malloc(sizeof(struct list_t)); 
    list->length = 0; 
    return list; 
} 

int append_list_node(struct list_t *list, struct node_t *new_node){ 
    if(list->head == NULL){ 
     list->head   = new_node; // edited 
     new_node->prev  = NULL; 
    }else{ 
     list->tail->next = new_node; 
     new_node->prev  = list->tail; 
    } 
    return (++list->length); 
} 

謝謝對於大家的超快反應,所有的答案都是正確的。正如我簡要地看在F5 -ing之間的代碼,我意識到我沒有設置tail,所以我決定改變線條爲標誌edited如下:

list->head = list->tail = new_node; 

我也將解決使用calloc()不過,我已經讀到,頻繁使用它會導致執行時間相當大的成本,因爲它正在清理和分配。思考?

+0

你可以用GDB運行它,並說出發生分段錯誤的位置嗎? – Maz 2011-05-05 16:12:17

+0

list-> tail-> next = new_node; list->當第一次執行此行時,tail是未初始化的 – yurib 2011-05-05 16:14:55

+0

** @ Maz **:顯然是我在編輯中提到的行。 ** @ yurib **:謝謝,檢查我的編輯,希望這是一個合理的解決方案。 – Dan 2011-05-05 16:20:11

回答

2

使用calloc()分配內存。 malloc()函數不會將內存初始化爲零(所以指針將被設置爲NULL)。你假設指針默認爲NULL。

+0

謝謝** Maz **;在我的書* C Programming:A Modern Approach 2nd Ed。*中,它提到'calloc'對於執行時間來說可能是昂貴的。有沒有這方面的基準?大量的呼叫是否會顯着? – Dan 2011-05-05 16:22:16

+0

我不知道由calloc()引起的任何性能下降。如果你更喜歡,你可以使用malloc(),然後使用memset()函數自行清零。 – Maz 2011-05-05 16:23:34

+1

有一些評論[我的回答](http://stackoverflow.com/questions/1538420/c-difference-between-malloc-and-calloc/1538427#1538427)有關'calloc'的問題,討論性能。您可能有興趣閱讀它們。 – 2011-05-05 16:27:39

2

C不會爲你做任何初始化。所以當你這樣做時:

struct list_t *new_list(void){ 
    struct list_t *list = malloc(sizeof(struct list_t)); 
    list->length = 0; 
    return list; 
} 

list->head可以是任何東西..並且可能不會是NULL。

+0

謝謝** Claudiu **;我正在使用顯式初始化更新我的代碼。 – Dan 2011-05-05 16:23:09

0

一個問題是,你從來沒有設置list-> tail到什麼東西,然後嘗試訪問list-> tail-> next,如果list-> head不是NULL(就像其他人指出的那樣,無論如何不能保證。)

+0

謝謝** dlev **;我注意到我的帖子後半秒鐘。 *哎呀!* :) – Dan 2011-05-05 16:24:12