原始碼中 LN Divide(LN *h) 回傳 結構體值 而非指標,且主函數未接收回傳值,導致分拆後的奇數鏈表丟失。
// 1. 回傳型別改為指標
LN* Divide(LN* h) {
LN* q = (LN*)malloc(sizeof(LN)); // 新鏈表頭節點
LN* b = q;
while (h != NULL && h->next != NULL) {
b->next = h->next; // 取出偶數節點
b = b->next;
h->next = b->next; // 原鏈表跳過該節點
h = h->next;
}
b->next = NULL; // 終結新鏈表
return q; // 回傳新鏈表頭指標
}
// 2. 主函數接收
int main() {
LN* h = Creat();
LN* q = Divide(h); // ✅ 接收回傳指標
printf("The even term is: ");
Printf(h); // 原鏈表剩下奇數項
printf("The odd term is: ");
Printf(q); // 新鏈表為偶數項
return 0;
}
| 錯誤寫法 | 正確寫法 | 說明 |
|---|---|---|
LN Divide(LN* h) | LN* Divide(LN* h) | 回傳指標而非結構體值 |
Divide(h); | LN* q = Divide(h); | 主函數必須接收回傳值 |
return *q; | return q; | 回傳指標本身,非解參考 |
原鏈表: Head -> 1 -> 2 -> 3 -> 4 -> 5 -> NULL 分拆後: 奇數鏈表 (h): Head -> 1 -> 3 -> 5 -> NULL 偶數鏈表 (q): Head -> 2 -> 4 -> NULL
LN** 或回傳新頭指標。malloc 後檢查 NULL,用完 free。b->next = NULL 切斷殘留連結,否則新鏈表會帶著舊尾巴。