close
這段程式碼的目的是銷毀一個鏈表。L
指向鏈表的頭節點,q
用來遍歷整個鏈表並釋放每一個節點的內存。在 while
循環中,L
和 q
的變化用來確保整個鏈表的每一個節點都被正確釋放。讓我們逐步分析 while
循環中的每一行程式碼的作用,並通過一個例子來說明 L
和 q
的變化。
程式碼分析
Status DistoryList_L(LinkList &L) {
if (!L) { // 如果線性表不存在,返回 ERROR
printf("線性表不存在\n");
return ERROR;
}
LinkList q = L->next; // 使 q 指向單鏈表的首元結點
while (q != NULL) { // 當 q 節點不為空時一直進入循環
free(L);
L = q; // 將 q 節點賦值給 L 節點
q = L->next; // 將 q 節點賦值給 L 節點以後使 q 節點指向 L 的下一個節點
}
free(L); // 此時 q 的值為 NULL,L 指向尾節點,將其釋放
L = NULL;
printf("線性表已銷毀\n");
}
if (!L) { // 如果線性表不存在,返回 ERROR
printf("線性表不存在\n");
return ERROR;
}
LinkList q = L->next; // 使 q 指向單鏈表的首元結點
while (q != NULL) { // 當 q 節點不為空時一直進入循環
free(L);
L = q; // 將 q 節點賦值給 L 節點
q = L->next; // 將 q 節點賦值給 L 節點以後使 q 節點指向 L 的下一個節點
}
free(L); // 此時 q 的值為 NULL,L 指向尾節點,將其釋放
L = NULL;
printf("線性表已銷毀\n");
}
例子說明
假設我們有一個鏈表:L -> A -> B -> C -> D -> NULL
-
初始狀態:
L
指向頭節點L
。q
指向節點A
。
-
第一次循環:
- 釋放
L
(即頭節點L
)。 L
被設為q
,現在L
指向節點A
。q
被設為L->next
,現在q
指向節點B
。
- 釋放
-
第二次循環:
- 釋放
L
(即節點A
)。 L
被設為q
,現在L
指向節點B
。q
被設為L->next
,現在q
指向節點C
。
- 釋放
-
第三次循環:
- 釋放
L
(即節點B
)。 L
被設為q
,現在L
指向節點C
。q
被設為L->next
,現在q
指向節點D
。
- 釋放
-
第四次循環:
- 釋放
L
(即節點C
)。 L
被設為q
,現在L
指向節點D
。q
被設為L->next
,現在q
指向NULL
。
- 釋放
-
循環結束:
q
為NULL
,跳出循環。- 釋放
L
(即節點D
)。 - 將
L
設為NULL
,表示整個鏈表已經被銷毀。
變化示例
步驟 | L 的位置 | q 的位置 |
---|---|---|
初始 | L | A |
1 | A | B |
2 | B | C |
3 | C | D |
4 | D | NULL |
結束 | NULL | NULL |
這個過程確保鏈表中的每一個節點都被釋放掉,並最終將鏈表頭指針設為 NULL
,表示鏈表已被銷毀。
全站熱搜