2015-11-06 25 views
4

我仍然有鏈接列表和結構之間的關係問題。如何初始化一個具有多變量結構的鏈接列表

請參閱我的對象是創建一個列表,其中每個節點包含2個字符的字符串。所以,我嘗試了這樣的東西:首先,我創建一個結構體,用我的2個字符表示一個元素;第二,我的名單的控制結構,這將指向我的名單的開始。其中,在我的.h,給出這樣的事情:

typedef struct s_def { char *first_word; char *second_word; struct s-def *next; } t_def 

typedef struct s_type { t_def *first; } t_list; 

接下來,我嘗試初始化我的列表。我作出這樣的工作,這樣的功能:

t_list *list; 
t_def *words; 

list = malloc(sizeof(*list)); 
words = malloc(sizeof(*words)); 
if (list == 0 || words == 0) 
    return (NULL); 
words = NULL; 
words->next = NULL; 
list->first = words; 

return (list); 

精密:我儘量讓空單現在,讓用戶可以在以後添加一些元素。

而這就是它阻塞的地方:當我運行程序時,它給出了典型的分割錯誤。但它沒有看到我所做的是什麼問題!我把一些寫在我的函數追溯過程:malloc的都行工作,以及字= NULL,但隨後的段故障似乎是在該行

words->next = NULL; 

什麼我做了錯誤的運行?爲什麼我不能在我的下一個單詞中給出NULL值?

回答

5

你先用分配的內存

words = malloc(sizeof(*words)); 

然後3號線下來,你設置的指針再次NULL初始化word指針,創造了內存泄露

words = NULL; 

然後嘗試取消引用你只需設置爲NULL的指針:

words->next = NULL; 

所以,只是刪除words = NULL;

+0

是啊!我試圖用'words-> first_word = NULL替換它。字 - > second_word = NULL',它通過了!現在,我有我的空列表,我的下一個難題將是正確地做一個如果檢查它是否爲空並填充它(儘管我也有一個分段錯誤)。無論如何,謝謝你,不! – LittleDev

+0

並修正了第二段故障!謝謝大家! – LittleDev

5

的問題是最有可能這一部分:

words = NULL; 
words->next = NULL; 

在這裏,您重新分配指針words是一個空指針,然後直接取消引用這個空指針,導致到未定義的行爲。

+0

是的,就是這樣,它給我的話代之以空值。謝謝 ! – LittleDev

1

當您將單詞設置爲NULL時,您創建了一個空指針。試圖通過單詞 - > next立即訪問它,實際上是在執行NULL-> next,這將導致錯誤。 您的代碼看起來有點複雜得多,它需要一個簡單的鏈表實現,你可以嘗試這樣的:

typedef struct s_element 
{ 
    char* firstWord; 
    char* secondWord; 
    s_element* next; 
} t_element; 


t_element* list = NULL; 

t_element* addFront(t_element* list, char* word1, char* word2) 
{ 
    t_element* next = list; 
    list = malloc(sizeof(t_element)); 
    if (!list) return NULL; 
    list->firstWord = word1; 
    list->secondWord = word2; 
    list->next = next; 
    return list; 
} 

假設我沒有作出任何骨爲首的語法錯誤,這應該是有關像鏈表一樣清晰可見。請注意,它不需要檢查列表是否爲空,唯一的條件是malloc失敗。

+0

這很有趣;我創建了2個結構,因爲我仍然在每個節點中有許多子值列表的想法。例如,我不知道如何配置add_elem函數。就像我說的,C中的新手!無論如何感謝 – LittleDev

+0

考慮鏈接列表的最簡單方法是將數據集合成一個「下一個」值。 「下一個」值是鏈接,其他都是內容。你需要單獨保留一個指向列表前面的指針(否則你不知道它從哪裏開始!)在上面的例子中,我展示瞭如何訪問新節點中的多個子值(它與任何指針引用的數據結構)。我相信你的add_elem和我的addFront函數是一樣的。希望這會有幫助。 – PeteB