双重链表

时间:2015-02-03 15:51:23

标签: c 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-&GT; PRC) - &gt;接着= pnt-&gt;接着,

2 个答案:

答案 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中运行程序,检查变量的值,观察评估等等。你可以在这里找到很多好的材料。