2011-02-09 43 views
7

我的方法:處理鏈表的陣列

固定長度的數組(可以說20)的每個元素是指向一個鏈表的第一個節點。 所以我有20個不同的鏈表。

這是結構:

struct node{ 
     char data[16]; 
     struct node *next; 
}; 

我對於數組聲明

struct node *nodesArr[20]; 

現在到一個新的節點添加到鏈接列表中的一個,我這樣做:

struct node *temp; 

temp = nodesArr[i]; // i is declared and its less than 20 
addNode(temp,word); // word is declared (char *word) and has a value ("hello") 
加入節點功能:

,並從鏈表的陣列打印數據,我這樣做:

void print(){ 
    int i; 
    struct node *temp; 

    for(i=0 ; i < 20; i++){ 
     temp = nodesArr[i]; 
     while(temp != NULL){ 
      printf("%s\n",temp->data); 
      temp = temp->next; 
     } 
    } 
} 

現在編譯器會發出任何錯誤,程序運行和我的數據傳遞給它,當我打電話打印它不打印任何東西,, ??

更新::

後,我編輯的代碼(感謝你),我想在打印功能的問題,,什麼想法?

+1

你試過踩着它通過一個調試器,或添加有用'printf'報表? –

+0

是啊我試過了,但我什麼都沒有 –

+1

你什麼都沒有?例如,你不能發現'nodesArr'的所有元素在什麼時候變成了'NULL'? –

回答

5

問題出在addNode()。當列表爲空你做:

q = malloc(sizeof(struct node)); 

q的範圍僅限於addNode()。你剛纔應該申報addNode()作爲

void addNode(struct node **q, char *d) 

,並相應地調整你的代碼:

*q = malloc(sizeof(struct node)); 

等等...

+0

這樣q = q->下一個,應該是這樣的,* q = * q-> next,或者(* q) - > next? –

+0

如果讓它更容易,一旦分配完畢,您可以將指向地址分配給單個指針,並將代碼的其餘部分或多或少地保存爲現在的樣子。 'struct node * sp;'然後'sp = * q' –

+0

@Rami Jarrar:您必須使用'* q =(* q) - > next'。 C大師會[告訴你](http://www.difranco.net/cop2220/op-prec.htm)' - >'比取消引用操作符具有更高的優先級。我們其他人只是使用一對括號,不用再考慮它了。 – thkala

3

當你通過struct node *qaddNode你給它一個數組元素的地址。如果你在裏面使用malloc,那麼你將覆蓋這個變量q,它是該函數的局部變量,現在指向不同的東西,但是你並沒有改變你的原始數組。嘗試使用指向節點的指針(struct node **q)。

2
void addNode(struct node *q, char *d){ 
    if(q == NULL) 
     q = malloc(sizeof(struct node)); 

這裏的問題。

q的新值不會超出該函數,因此您的鏈接列表數組永遠不會更新。

通常這裏的解決方案是使用雙指針:

void addNode(struct node **q, char *d){ 
    if(*q == NULL) 
     *q = malloc(sizeof(struct node)); 

,並調用它像這樣:

addNode(&nodesArr[i],word); 

然後,如果你malloc一個新的節點,數組中的價值將被設置爲指向新節點。

-2
struct node 
{ 

    int actual, estimated; 

    char c; 

    struct node *next; 

} *head[4], *var[4], *trav[4]; 


void 
insert_at_end (char c, int value, int value1) 
{ 

    struct node *temp; 

    temp = head[i]; 

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

    var[i]->actual = value; 

    //var1=(struct node *)malloc(sizeof(struct node)); 

    var[i]->estimated = value1; 

    var[i]->c = c; 

    //printf("%d",var->estimated); 

    if (head[i] == NULL) 

    { 

     head[i] = var[i]; 

     head[i]->next = NULL; 

    } 

    else 

    { 

     while (temp->next != NULL) 

    { 

     temp = temp->next; 

    } 

     var[i]->next = NULL; 

     temp->next = var[i]; 

    } 

}