我写了一个程序,通过双向链表来管理银行账户,但我发现取消程序有问题。
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-&GT; PRC) - &gt;接着= pnt-&gt;接着,
答案 0 :(得分:1)
while循环之后的行导致问题,即pnt = pnt-&gt; next应该在if-else之后。因此,如果只有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);
}
}
答案 1 :(得分:0)
检查指针以确保它们不是NULL。这可以通过两个简单的if循环来完成。你总是要注意这种带有双重链接列表的东西,你必须仔细考虑你的指示顺序。
然后,在将指针设置为&#34;指向&#34;当前节点,将当前节点的指针设置为NULL。
另外,请考虑使用gdb
。这是Gnu DeBugger。如果使用gcc
进行编译,则可以说gcc -g <files and other stuff>
使用gdb
调试符号进行编译。然后你可以在gdb
中运行程序,检查变量的值,观察评估等等。你可以在这里找到很多好的材料。