2013-10-01 62 views
0

所以我有一個鏈表建立這樣的:初始化錯誤誤會......需要一些澄清

#define MAX 20 
//structure for a single linked list 
typedef struct element { 
    int info; 
    struct element *link; 
} Tnode; 

//structure for a grapgh 
typedef struct graphAdjList { 
    int nodes; 
    Tnode *adjList[MAX]; 
} Tgraph; 

在我的代碼我有它設置如下:

Tgraph *graph; 

graph = (Tgraph*) malloc(sizeof(Tgraph)); 
graph -> nodes = 0; 

for(i; i < 20; i++){ 

    graph->adjList[i]= NULL; 
} 

graph->adjList[2]->info = 222; 

現在,如果我編譯這我在這最後一行得到訪問衝突。是否我沒有爲結構的Tnode部分保留內存,或者我是否缺少某些東西。我如何初始化數組,以便可以爲數組的任何元素中的信息賦值?

謝謝

傑森

回答

1

你說得對,問題在於你沒有爲adjList中的單個節點分配內存。

當你做graph->adjList[2]->info = 222;時,graph->adjList[2]仍然是for循環之前的NULL

要解決這個問題,你需要爲它第一次分配內存,如下所示:

graph->adjList[2] = malloc(sizeof(TNode)); 

注:可以只是graph->adjList[i] = malloc(sizeof(Tnode));取代graph->adjList[i] = NULL;在for循環,但是,當您去可能是有用的分配爲了記憶效率。

+0

好吧,如果我有Tnode * newnode,* tail = NULL,* head = NULL;然後newnode =(Tnode *)malloc(sizeof(Tnode)); \t \t \t newnode-> info = 1; \t \t \t newnode-> link = NULL; \t \t \t graph-> adjList [k] - > link = newnode;這會正確設置鏈接列表嗎? – Xintaris

+0

假設內存分配給'graph-> adjList [k]',那麼至少可以避免涉及不分配內存的問題。另外,不要強制轉換'malloc'的返回值;鑄造可以隱藏其他問題。 –

0

您需要更換

graph-> adjList [我] = NULL;

graph-> adjList [I] =(TNODE *)malloc的(的sizeof(TNODE));