typedef struct Node {
int data;
struct Node *next;
} Node;
void createList(Node *pHead, int len) { // 一級指標參數
Node *pTail = pHead;
for (int i = 0; i < len; i++) {
Node *pNew = malloc(sizeof(Node));
pNew->data = i;
pNew->next = NULL;
pTail->next = pNew;
pTail = pNew;
}
// pHead 在此處指向新鏈表頭,但無法傳回 main!
}
int main() {
Node *head = NULL;
createList(head, 5); // head 仍為 NULL!
return 0;
}
C 語言參數傳值。createList 內的 pHead 是 main 中 head 的副本 (同樣地址值)。函數內修改 pHead 指向 (如 pHead = pNew) 只改變副本,不影響實參 head。
void createList(Node **ppHead, int len) {
Node *pTail = *ppHead; // 可能為 NULL
for (int i = 0; i < len; i++) {
Node *pNew = malloc(sizeof(Node));
pNew->data = i;
pNew->next = NULL;
if (!*ppHead) { // 空表
*ppHead = pNew;
pTail = pNew;
} else {
pTail->next = pNew;
pTail = pNew;
}
}
}
int main() {
Node *head = NULL;
createList(&head, 5); // 傳地址
// head 現在正確指向鏈表頭
}
Node* createList(int len) {
Node *head = NULL, *tail = NULL;
for (int i = 0; i < len; i++) {
Node *pNew = malloc(sizeof(Node));
pNew->data = i;
pNew->next = NULL;
if (!head) head = tail = pNew;
else { tail->next = pNew; tail = pNew; }
}
return head;
}
int main() {
Node *head = createList(5);
}
void createList(Node *&head, int len) { // 引用參數
// 同一級指標邏輯,直接修改 head
}
Node* createWithDummy(int len) {
Node *dummy = malloc(sizeof(Node)); // 頭節點不存數據
dummy->next = NULL;
Node *tail = dummy;
for (int i = 0; i < len; i++) {
Node *pNew = malloc(sizeof(Node));
pNew->data = i;
pNew->next = NULL;
tail->next = pNew;
tail = pNew;
}
return dummy; // 返回頭節點
}
// 使用
Node *head = createWithDummy(5);
Node *firstData = head->next; // 首個數據節點
「要改指標指向,傳指標的地址;或直接返回新指標;C++ 再用引用最方便。」
realloc 可能改變地址)int *out_err_code)統統遵循同一原則:傳遞指標的地址 (二級指標) 或返回新值。