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

C 語言單向鏈表帶頭節點初始化:形參必須用指標的指標或引用

     編輯:程式設計疑難解答

原代碼 `void init(List w)` 形參為值傳遞,函式內 `w = malloc(...)` 只修改副本,呼叫端 `list1` 仍為野指標。

錯誤代碼


typedef struct Node { int data; struct Node* next; } *List;
void init(List w) { w = malloc(sizeof(struct Node)); w->next = NULL; } // 錯誤
int main() { List L; init(L); } // L 未改變

修正方案一:二級指標 (C 標準寫法)


void init(List* w) {          // 形參:指標的指標
    *w = malloc(sizeof(struct Node));
    (*w)->next = NULL;
}
int main() {
    List L; init(&L);           // 傳遞 L 的位址
}

修正方案二:C++ 引用 (若編譯器支援)


void init(List& w) { w = malloc(sizeof(struct Node)); w->next = NULL; }
int main() { List L; init(L); }

修正方案三:回傳新頭節點 (最直觀)


List init() {
    List head = malloc(sizeof(struct Node));
    head->next = NULL;
    return head;
}
int main() { List L = init(); }

完整可執行範例 (含插入、列印、釋放)


#include 
#include 

typedef struct Node { int data; struct Node* next; } Node;
typedef Node* List;

List createList() {
    List head = malloc(sizeof(Node));
    head->next = NULL;
    return head;
}

void insertTail(List head, int val) {
    Node* p = head;
    while (p->next) p = p->next;
    Node* n = malloc(sizeof(Node)); n->data = val; n->next = NULL;
    p->next = n;
}

void printList(List head) {
    for (Node* p = head->next; p; p = p->next) printf("%d ", p->data);
    puts("");
}

void freeList(List head) {
    Node* p = head;
    while (p) { Node* n = p->next; free(p); p = n; }
}

int main() {
    List L = createList();
    for (int i=1; i<=5; ++i) insertTail(L, i*10);
    printList(L); // 10 20 30 40 50
    freeList(L);
    return 0;
}

核心口訣

「C 語言函式要修改呼叫端指標變數本身,**必須傳遞指標的位址 (二級指標) 或回傳新指標**」,單級指標值傳遞只能修改指向的記憶體內容,無法修改指標變數本身。

掌握此原則,鏈表初始化、插入、刪除、反轉等所有修改頭指標的操作都能寫對。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved