error C2664: 'traverse_list' : cannot convert parameter 1 from 'struct Node *' to 'struct Node'
// 聲明
void traverse_list(NODE pHead); // NODE 即 struct Node
// 定義
void traverse_list(PNODE pHead) // PNODE 即 struct Node *
{ ... }
// 調用
PNODE pHead = create_list();
traverse_list(pHead); // 傳遞指針
函數聲明參數類型為 NODE(結構體值傳遞),而定義與調用均使用 PNODE(指針傳遞)。編譯器根據聲明進行類型檢查,發現實參 struct Node * 無法隱式轉換為 struct Node,故報錯。
統一聲明、定義、調用的參數類型為指針:
// 正確聲明
void traverse_list(PNODE pHead); // 或 void traverse_list(struct Node *pHead);
typedef struct Node *PNODE; 後,優先使用 PNODE 表達指針語義,減少 struct Node * 直接出現。-Wall -Wextra(GCC/Clang)或 /W4(MSVC),可在編譯期捕獲此類不匹配。原代碼採用頭插法,導致節點順序與輸入順序相反。若需保持順序,請改用尾插法:
PNODE pTail = pHead;
for (...) {
PNODE pNew = malloc(sizeof(NODE));
pNew->data = val;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pNew;
}