close

這段程式碼的目的是銷毀一個鏈表。L 指向鏈表的頭節點,q 用來遍歷整個鏈表並釋放每一個節點的內存。在 while 循環中,Lq 的變化用來確保整個鏈表的每一個節點都被正確釋放。讓我們逐步分析 while 循環中的每一行程式碼的作用,並通過一個例子來說明 Lq 的變化。

程式碼分析

 
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"); 
}
 

例子說明

假設我們有一個鏈表:L -> A -> B -> C -> D -> NULL

  1. 初始狀態:

    • L 指向頭節點 L
    • q 指向節點 A
  2. 第一次循環:

    • 釋放 L(即頭節點 L)。
    • L 被設為 q,現在 L 指向節點 A
    • q 被設為 L->next,現在 q 指向節點 B
  3. 第二次循環:

    • 釋放 L(即節點 A)。
    • L 被設為 q,現在 L 指向節點 B
    • q 被設為 L->next,現在 q 指向節點 C
  4. 第三次循環:

    • 釋放 L(即節點 B)。
    • L 被設為 q,現在 L 指向節點 C
    • q 被設為 L->next,現在 q 指向節點 D
  5. 第四次循環:

    • 釋放 L(即節點 C)。
    • L 被設為 q,現在 L 指向節點 D
    • q 被設為 L->next,現在 q 指向 NULL
  6. 循環結束:

    • qNULL,跳出循環。
    • 釋放 L(即節點 D)。
    • L 設為 NULL,表示整個鏈表已經被銷毀。

變化示例

步驟 L 的位置 q 的位置
初始 L A
1 A B
2 B C
3 C D
4 D NULL
結束 NULL NULL

這個過程確保鏈表中的每一個節點都被釋放掉,並最終將鏈表頭指針設為 NULL,表示鏈表已被銷毀。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 JC 的頭像
    JC

    JC優友

    JC 發表在 痞客邦 留言(0) 人氣()