c - 双向链表

标签 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->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);
   }

关于c - 双向链表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28303127/

相关文章:

c - 在双向链表中添加重复项(字符串)

java - 为什么我们不能手动迭代 LinkedList?

java - 从链表中删除相同的元素

c - 如何使用基地址在 C 中打印二维矩阵的元素?

c - 为什么会出现未对齐的内存访问错误? [皮质 M4]

C读取调用缓冲额外字符

双链表删除函数的代码减少

c - 驱动程序蓝屏死机系统服务异常

谁能解释一下这个 CUDA 内核是如何执行的?

algorithm - 黑客排名 : Inserting a Node Into a Sorted Doubly Linked List - Kotlin