首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C 語言鏈表奇偶分拆:指標傳遞與函數回傳值的正確姿勢

     編輯:程式設計疑難解答

問題:Divide 函數回傳頭指標,主函數卻接不到

原始碼中 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 切斷殘留連結,否則新鏈表會帶著舊尾巴。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved