2012-09-17 64 views
1
typedef struct { 
char name [25] ; 
char breed [25] ; 
int age ; 
struct animal *next ; 
} animal ; 

animal *ptr1 , *ptr2 , *prior ; 
ptr1 = (animal*)malloc(sizeof (animal)) ; 
strcpy ((*ptr1).name , "General") ; 
strcpy ((*ptr1).breed , "Foreign breed") ; 
(*ptr1).age = 8 ; 


(*ptr1).next = NULL ; 
prior =ptr1 ; 
printf ("%s\n" , (*prior).name) ; 
printf ("%s\n" , (*prior).breed) ; 
printf ("%d\n" , (*prior).age) ; 
printf ("%p\n" , (*prior).next) ; 
free (ptr1) ; 
ptr1 = (animal*)malloc(sizeof (animal)) ; 
strcpy ((*ptr1).name , "General 1") ; 
strcpy ((*ptr1).breed , "Abroad breed") ; 
(*ptr1).age = 24 ; 
(*ptr1).next = NULL ; 
(*prior).next = ptr1 ; 

以下是繪製鏈接列表的代碼。 整個代碼時執行示出了在最後一行的錯誤:鏈接列表語法

在函數「主」: 警告:從兼容的指針類型[默認啓用]

+0

如果您指出_where_出現錯誤,它可能會有所幫助。由於這是一個編譯錯誤(即不是程序錯誤,而是編譯器關於代碼的某些問題的錯誤),錯誤消息包含一個行號。今後,請發佈_all_消息,完成並未經編輯。 –

+1

請注意,在最後一行之前是指向先前釋放的內存區域;這可能會導致程序崩潰 – Jack

+2

此外,爲什麼使用例如'(* ptr1).next'而不是更普通的'ptr1-> next'? –

回答

0

「標籤」的名字空間(struct後的名稱)和標識符名字空間(您typedef聲明之一,例如。)是不同的C.

最簡單的,我覺得,是永遠向前聲明struct標籤和typedef一氣呵成:

typedef struct animal animal; 

從此,你可以很容易地使用typedef名甚至struct的聲明中:

struct animal { 
    .... 
    animal* next; 
}; 
+0

你的幫助和迭代使我駛過..謝謝你們。 –

+0

@sauravverma,如果答案對你有幫助,請將它們投票,然後選擇真正解答你的問題並「接受」它的那個。 –

0

animal分配是名稱typedef,而不是結構。試試這個:

typedef struct _animal { 
    char name [25]; 
    char breed [25]; 
    int age; 
    struct _animal *next; 
} animal; 
+0

你應該永遠不要有帶前導下劃線的全局名稱,因爲它們是保留的。 –

+0

而在這種情況下,你甚至不需要下劃線,'typedef struct animal {...}動物;'完全有效。 –

1

改變你的藥結構定義這個

typdef struct Animal_ 
{ 
    char name [25]; 
    char breed [25]; 
    int age; 
    struct Animal_* next; 
} Animal; 

沒有Animal_的結構是匿名結構,而不能有一個指針。

+1

下劃線沒有必要。 –

1

更改您的聲明:

typedef struct animal { 
    char name [25] ; 
    char breed [25] ; 
    int age; 
    struct animal *next; 
} animal; 

結構變量animal已添加的聲明。 您現在有animal類型的別名struct animal

0

這實際上是一個警告,而不是一個錯誤。 我不明白你爲什麼使用(* s).m而不是s-> m。它更簡單,更自然。 我沒有看到你的代碼中的函數main和你得到錯誤的行,我想你的所有代碼除了struct聲明都是main函數。 嘗試聲明你的結構是這樣的(你可能還需要添加一個「typedef struct animal」,具體取決於你的編譯器): struct animal { ... animal * next; };