這段程式碼的目的是銷毀一個鏈表。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,表示鏈表已被銷毀。
請先 登入 以發表留言。