簡體   English   中英

雙鏈表

[英]A doubly linked list

我編寫了一個程序來通過雙向鏈接列表來管理銀行帳戶,但是我發現取消程序存在問題。

void suppCompte (int numCpt) {
    CompteBancaire *pnt = first;
    if (first==NULL) {
        printf("la liste vide !\n");
    }else{
        while (pnt != NULL && pnt->idf.numCompte != numCpt) {
            pnt=pnt->next;
            if (pnt==first) {        // Remove the first node
                first=pnt->next;
                free(pnt);
            }else if (pnt->next==NULL) {  // Remove the last node 
                pnt->prc->next=NULL;
                free(pnt);
            }else{                       // Remove a moddle node
                pnt->prc->next=pnt->next; // <==== !!!!
                pnt->next->prc=pnt->prc;  // <==== !!!!
                free(pnt);
            }
        }
    }
}

即使我嘗試執行此方法,我仍然遇到相同的問題:-(pnt-> prc)-> next = pnt-> next;

while循環之后的行會引起問題,即pnt = pnt-> next應該在if-else if之后。 因此,如果只有1個節點,則pnt將為NULL,這會在else部分引起問題。 修改后的代碼是:

void suppCompte (int numCpt) 
{  
   CompteBancaire *pnt=first;
   if (first==NULL)
       printf("la liste vide !\n");
   else
   {   

      while (pnt!=NULL && pnt->idf.numCompte!=numCpt)
        CompteBancaire *temp=pnt;
         if (pnt==first)           // Remove the first node
        {       first=pnt->next;
        }
         else if (pnt->next==NULL)  // Remove the last node 
        {        pnt->prc->next=NULL;
         }
        else                       // Remove a moddle node
        {        pnt->prc->next=pnt->next;  <==== !!!!
                 pnt->next->prc=pnt->prc;   <==== !!!!
         }
        pnt=temp->next;
        free(temp);
   }

}

檢查您的指針,以確保它們不是NULL。 這可以通過兩個簡單的if循環來完成。 您總是需要注意帶有雙重鏈接列表的這類事情,並且必須仔細考慮指令的順序。

然后,在將指針設置為“圍繞”當前節點進行排序之后,將當前節點的指針設置為NULL。

另外,考慮使用gdb 它是古努·德布格(Gnu DeBugger)。 如果使用gcc編譯,則可以說gcc -g <files and other stuff>以使用gdb調試符號進行編譯。 然后,您可以在gdb運行該程序,並檢查變量的值,觀察東西的評估等。您可能會在此上找到很多不錯的材料。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM