typedef struct book_node {
struct book data;
struct book_node *next;
} Book_Node, *Book_Link; // Book_Node 是結構體類型,Book_Link 才是指針類型
// 使用時
Book_Node *p; // 此處 p 是「指向結構體的指針」,正確
// 若寫成 Book_Link p; 則 p 直接是指針,無需再加 *
printf("%s %d", p->data.name, p->data.price); // 正確:兩個參數匹配兩個佔位符
// 若寫成
printf("%s", p->data.name, p->data.price); // 錯誤:格式字符串只有 1 個 %s,但傳了 2 參數
// 或
printf("%s %d", p->data.name); // 錯誤:缺參數,輸出亂碼/崩潰
Book_Node = struct book_node(值類型)Book_Link = struct book_node*(指針類型)Book_Node node; 或 Book_Link p;(等價於 Book_Node *p;)%s 對 char*,%d 對 int,數量、順序、類型必須一一匹配。gcc -Wall -Wextra -Wformat=2 可捕獲格式字符串不匹配。typedef struct book {
char name[50];
int price;
} Book;
typedef struct book_node {
Book data;
struct book_node *next;
} Book_Node, *Book_Link;
void print_list(Book_Link head) {
for (Book_Link p = head; p != NULL; p = p->next) {
printf("書名: %-20s 價格: %5d\n", p->data.name, p->data.price);
}
}
int main() {
Book_Node n1 = {{"C Primer Plus", 89}, NULL};
Book_Node n2 = {{"TCP/IP Illustrated", 120}, NULL};
n1.next = &n2;
print_list(&n1);
return 0;
}
「typedef 別名看定義:結構體名是值,帶星號的是指針;printf 參數對格式,多一個少一個都不行。」
理清 Book_Node vs Book_Link 的類型本質,配上 -Wformat 守門,結構體鏈表輸出零失誤。