2014-02-17 46 views
1

我試圖動態分配指針列表結構,每個包含結構列表如下定義的指針:名單在C列表

struct node { 
    char *text; 
    struct node *next; }; 

我也使用一個typedef:

typedef struct node Node; 

我創建節點列表通過聲明來保存每個列表如下:

Node **list; 
list = (struct node**) malloc(sizeof(struct node*) * arraySize); 

在每個list我有我正在創建另一個列表如下節點:

list[i] = malloc(sizeof(struct node*) * subArraySize); 

我有幾個問題:

  1. 這是這樣一個問題的正確實施?
  2. 如何訪問較大列表中每個列表的第一個節點的text數據成員?

如果我的問題含糊不清,請告訴我。我對這個話題的困惑使我很難正確地說出我的問題。

+1

您的typedef沒有任何用處。您使用單詞「list」(和變量名稱「list」)來引用列表和數組。當您不清楚您有任何圖層正常工作時,您正試圖使用​​間接塔。你必須先從簡單的問題入手,並處理複雜的問題,否則你肯定會失敗。 – Beta

+1

看起來你試圖構建一個包含指向幾個鏈表頭的數組,對吧?第二部分,'list [i] = malloc(sizeof(struct node *)* subArraySize);'是一種誤導,因爲您提前爲多個'節點'分配了連續的內存塊,而通常您可能會在創建時爲每個節點分配內存,或者至少你不會使用這個非常嚴格的二維數組結構。 – 2rs2ts

+2

如果您嘗試製作指向鏈接列表的動態數組指針,則輔助malloc沒有任何意義。後者是*鏈接列表*,因此不需要分配矢量(假設「下一個」成員不僅僅是出於窗口修飾或其他惡意目的)。那就是說,你真的試圖解決什麼問題,一個帶有碰撞鏈的散列表? – WhozCraig

回答

2

假設你的內存分配,並正確填寫,你會通過訪問較大node**陣列中的每個node*數組的第一個節點的text數據成員:

list[i]->text 

但是,要回答你的問題關於實施是否正確,這不是真的。你可能會更快樂這樣做:

struct node **list; 
list = (struct node**) calloc(sizeof(struct node*) * arraySize); 
for (int i=0; i<arraySize; ++i) { 
    list[i] = (struct node*) malloc(sizeof(struct node)); 
    list[i]->text = ""; // or whatever you want to start with 
    list[i]->next = NULL; 
} 

這將創建一個node**陣列(稱爲list,因爲你想把它叫,但我會稱之爲別的東西表明它是node陣列爲基礎的鏈表),然後爲每個磁頭node實例化一塊內存,以便list滿有效的node*,您可以開始使用它們。

當你去附加一些東西給每個鏈表時,你會做這樣的事情(這會追加到最後,如果你想要排序的數據等,你可以根據比較值實現插入。 ):

int i = index_where_you_want_to_insert; 
struct node *currNode = list[i]; 
struct node *newNode = (struct node*) malloc(sizeof(struct node)); 
newNode->text = ""; // or whatever you want to start with 
newNode->next = NULL; 
while(currNode->next != NULL) { 
    currNode = currNode->next; 
} 
currNode->next = newNode; 

它也可以幫助你看到this question有關使用typedef用鏈表。

如果我在我的代碼中發現任何語法或語義錯誤,我很抱歉,自從我寫C並且我可能會生鏽以至於如何引用struct s。我歡迎更正。