void DestroyLinkList(LinkList L) {
if(L==NULL) return 0; // void 函數不能 return 0
if(L->next!=NULL) { // 僅處理第二個節點
p=L;
L=L->next;
free(p);
}
free(head); // head 未定義
head=NULL; // head 未定義
p=NULL;
return 0; // void 不能返回值
}
嚴重錯誤:
head、pvoid 函數非法返回值void DestroyLinkList(LinkList *L) { // 傳二級指針,可修改頭指針
if (L == NULL || *L == NULL) return;
LinkList p = *L;
LinkList q;
while (p != NULL) {
q = p->next; // 保存下一個
free(p); // 釋放當前
p = q; // 移動到下一個
}
*L = NULL; // 頭指針置 NULL,防止野指針
}
LinkList head = CreateList(); // 假設創建帶頭節點的鏈表
DestroyLinkList(&head); // 傳頭指針地址
// head 現在為 NULL
void DestroyLinkList_NoHead(LinkList *L) {
LinkList p = *L;
while (p) {
LinkList tmp = p;
p = p->next;
free(tmp);
}
*L = NULL;
}
| 要點 | 正確做法 |
|---|---|
| 遍歷釋放 | while(p) { q=p->next; free(p); p=q; } |
| 修改頭指針 | 傳 LinkList* (二級指針),結束置 NULL |
| 變量聲明 | 所有指針變量使用前聲明 |
| 返回類型 | void 不返回值 |
| 頭節點處理 | 帶頭節點:頭節點也需 free;無頭節點:直接從第一個數據節點 free |