2014-10-29 58 views
0

我正在使用鏈表的數組的等待列表中。我之前使用過鏈表,但無法弄清楚如何將數組傳遞給函數。我已經開始聲明頭指針和尾指針的數組了。我收到此錯誤:將鏈表的數組傳遞到函數中

warning: incompatible pointer types passing 'struct node *(*)[4]' 
     to parameter of type 'struct node ***' [-Wincompatible-pointer-types] 
           add(&head,&tail); 
              ^~~~~ 
lab6.c:10:31: note: passing argument to parameter 'tail' here 
void add(NODE ***head,NODE ***tail); 

這裏是我的代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#define NODE struct node 
struct node { 
    char name[20]; 
    int number; 
    NODE *next; 
}; 
void add(NODE ***head,NODE ***tail); 
void delete(NODE ***head,NODE ***tail); 
void show(NODE ***head); 

int main() { 
    //Initialize 
    NODE *head[4]={NULL,NULL,NULL,NULL}; 
    NODE *tail[4]={NULL,NULL,NULL,NULL}; 
    int whileLoop=0; 
     while(whileLoop==0) { 
       int selection; 
       printf("Choose an Option: 1)Add new party 2)Remove table 3)Show list 4)Quit: "); 
       scanf("%d",&selection); 

       switch(selection) { 
         case 1: 
           add(&head,&tail); 
           break; 
         case 2: 
           delete(&head,&tail); 
           break; 
         case 3: 
           show(&head); 
           break; 
         case 4: 
       whileLoop=1; 
           break; 
         default: 
           add(&head,&tail); 
       } 
     } 
     return 0; 
} 
void add(NODE ***head,NODE ***tail) { 
    char tempName[20]; 
    printf("enter a name for the party: "); 
    scanf("%s",tempName); 
    printf("enter a party size: "); 
    int tempSize; 
    scanf("%d",&tempSize); 
    if (tempSize>0) { 
     NODE *ptr=(NODE *)malloc(sizeof(NODE)); 
     strcpy(ptr->name,tempName); 
     ptr->number=tempSize; 
     ptr->next=NULL; 
     int i; 
     if (tempSize>=1 && tempSize<=2) { 
      i=0; 
     } else if (tempSize>=3 && tempSize<=4) { 
      i=1; 
     } else if (tempSize>=5 && tempSize<=6) { 
      i=2; 
     } else { 
      i=3; 
     } 
     if (NULL==*head[i]) { 
      *head[i]=*tail[i]=ptr; 
     } else { 
      (*tail[i])->next=ptr; 
      (*tail[i])=ptr; 
     } 
    } else { 
     printf("Valid size not entered"); 
    } 



} 
void delete(NODE ***head,NODE ***tail) { 


} 
void show(NODE ***head) { 


} 
+2

而不是使用'#define',你可以在結構上使用'typedef'。增加可讀性。 – 2014-10-29 09:32:24

+1

因爲你實際上並沒有在'add'函數中分配'head'或'tail',所以你不需要通過「引用」來傳遞。我建議你放棄一個間接。 – 2014-10-29 09:34:07

+1

至於你的問題,指向指針數組的指針*不是指向指針指針的指針。按照上面的我的建議,你也會真正解決你的編譯器錯誤。 – 2014-10-29 09:35:58

回答

1

你有指針數組節點,這將衰變爲指針的指針,當作爲參數傳遞給節點。您在數組條目(對列表的正面和反面)中所做的更改將是永久性的。

因此,對於你的函數簽名是:

void add(NODE **head, NODE **tail); 

此客戶端代碼:

NODE *head[4] = {NULL, NULL, NULL, NULL}; 
NODE *tail[4] = {NULL, NULL, NULL, NULL}; 

add(head, tail); 

而且裏面add,你的地址列表的頭部爲head[i]

+0

謝謝!這解決了我的編譯器錯誤。 – 2014-10-29 18:31:02