当前位置: 首页 > 知识库问答 >
问题:

双链表

董霖
2023-03-14

我写了一个程序,通过双链表管理银行账户,但我发现取消程序有问题。

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)-

共有2个答案

谢璞
2023-03-14

检查指针,确保它们不为空。这可以通过两个简单的if循环来实现。使用双链接列表时,您必须始终注意这类事情,并且必须仔细考虑指令的顺序。

然后,在将指针设置为排序“指向”当前节点之后,将当前节点的指针设置为NULL。

另外,考虑使用<代码> GDB < /代码>。这是Gnu调试器。如果使用gcc编译,可以说gcc-g

聂昱
2023-03-14

while循环后的线路会导致问题,即pnt=pnt-

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

}

 类似资料:
  • 本文向大家介绍双向链表和双向循环链表?相关面试题,主要包含被问及双向链表和双向循环链表?时的应答技巧和注意事项,需要的朋友参考一下 双向链表: 包含两个指针,一个prev指向前一个节点,一个next指向后一个节点。 双向循环链表: 最后一个节点的 next 指向head,而 head 的prev指向最后一个节点,构成一个环。

  • 主要内容:双向链表的创建目前我们所学到的 链表,无论是动态链表还是 静态链表,表中各节点中都只包含一个指针(游标),且都统一指向直接后继节点,通常称这类链表为 单向链表(或 单链表)。 虽然使用单链表能 100% 解决逻辑关系为 "一对一" 数据的存储问题,但在解决某些特殊问题时,单链表并不是效率最优的存储结构。比如说,如果算法中需要大量地找某指定结点的前趋结点,使用单链表无疑是灾难性的,因为单链表更适合 "从前往后"

  • 链表作为数组之外的一种常用序列抽象, 是大多数高级语言的基本数据类型, 因为 C 语言本身不支持链表类型, 大部分 C 程序都会自己实现一种链表类型, Redis 也不例外 —— 实现了一个双端链表结构。 双端链表作为一种常见的数据结构, 在大部分的数据结构或者算法书里都有讲解, 因此, 这一章关注的是 Redis 双端链表的具体实现, 以及该实现的 API , 而对于双端链表本身, 以及双端链表

  • 双向链表 结构体 struct   rt_list_node   双向链表节点 更多...   宏定义 #define  rt_container_of(ptr, type, member)   ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))   获取type结构体中member成员在这个结构体中的偏移   #de

  • 双向链表 Linux 内核自己实现了双向链表,可以在 include/linux/list.h 找到定义。我们将会从双向链表数据结构开始内核的数据结构。为什么?因为它在内核里使用的很广泛,你只需要在 free-electrons.com 检索一下就知道了。 首先让我们看一下在 include/linux/types.h 里的主结构体: struct list_head { struct l

  • 我创建了一个双循环链表。 我需要知道每个节点到头部的距离。 因为当我必须删除或获取具有特定密钥的节点时,如果两个节点具有相同的密钥和相同的距离,则必须删除或获取这两个节点,否则必须删除最靠近头部的节点。 我不知道如何计算距离,因为它是圆形的。。。 这个链表的插入就是这样工作的。 所有的节点都去追头。 例: 1)头部 2) 头部A(插入A) 3) 头部B-A(插入B) 4) 头部C-B-A(插入C)