[英]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.