【问题标题】:C doubly linked circular list insertC双向链表插入
【发布时间】:2015-05-15 12:30:00
【问题描述】:

不插入也不保留下一个和上一个节点的地址:我正在尝试从文件中读取输入;它可以正确读取所有数据,并根据每一行创建一个 Aeronava 对象。插入似乎不起作用。有什么建议吗?

void insertFAV_Av(FAVnode*list, Aeronava *av){
        FAVnode* nn = (FAVnode*)malloc(sizeof(FAVnode));
        //first = list;
        nn->infoUtil = (Aeronava*)malloc(sizeof(Aeronava));
        nn->infoUtil->idAeronava = (char*)malloc(strlen(av->idAeronava) + 1);
        //strcpy(nn->infoUtil->idAeronava, av->idAeronava);
        nn->infoUtil = av;
        if (first == NULL){
            nn->prev = nn->next = nn;
            first = nn;
        }
        else{
            list = first;
            while (list->next != first){
                list = list->next;
            }
            nn->prev = list;
            list->next = nn;
            nn->next = first;

        }
}


struct Aeronava{
    char* idAeronava;
    tipA tipAero;
    short int nrLocuri;
    double greutateMaxima;
};

struct FAVnode{
    FAVnode*next;
    FAVnode*prev;
    Aeronava* infoUtil;
};

【问题讨论】:

  • 标准警告:请do not castmalloc()C 中的家人的返回值。
  • 如果有nn->infoUtil = av;,你为什么要先malloc()ed?除了anaything,这是一个内存泄漏。
  • 请详细说明“不插入”是什么意思; 应该发生什么,以及相反会发生什么。
  • insert 这里的意思是,根据作为参数发送的对象创建一个新节点并将其插入到列表的末尾
  • 如果它是双重链接的,你不需要遍历整个列表来找到它的结尾。只需使用list = first->prev

标签: c linked-list insert circular-list


【解决方案1】:
        nn->prev = list;   // 1
        list->next = nn;   // 2
        nn->next = first;  // 3

第 1 行和第 2 行在两个方向上链接 nnlist,但第 3 行仅在一个方向上链接 nnfirst。您在这里缺少相反的链接更新:

        first->prev = nn;

【讨论】:

    【解决方案2】:

    我在这里看到了一些问题。首先是这样的:

         else{
            list = first;
            while (list->next != first){
                list = list->next;
            }
            nn->prev = list;
            list->next = nn;
            nn->next = first;
    

    您首先分配给列表。 List 是传递的参数。通过这样做,你正在破坏它。正确的插入例程如下所示:

    void insert_node(node_t **head, node_t **tail, nodedata_t *data)
      {
        /* Do some stuff */
    
    
        /* Insert Node */
        if (*list == NULL)
            {
              *head = data;
              *tail = data;
          else
            {
              *tail->next = data;
              *tail->next->prev = *tail;
              *tail->next->next = NULL;
              *tail = data;
            }
      }
    

    这将插入到列表的末尾。对于列表的中间部分,您可以将 else 中的代码更改为以下内容:

    data->next = curr->next;
    data->prev = curr;
    data->next->prev = data;
    curr->next = data;
    

    变量 curr 被定义为“node_t *curr;”它的工作方式是你有一个指向数据的指针,你有一个指向当前节点的指针,并且当前节点之后存在,我们称之为蓝色。因此,您将数据中的 next 设置为指向蓝色,将数据中的 prev 设置为指向 curr。然后将 prev 设置为蓝色以指向数据,将 next 设置为 curr 以指向数据。然后列表插入完成。还有另一种特殊情况没有解决,即在列表末尾插入。但我会把它留给读者作为练习。

    我还注意到一件事。无需对 malloc 的指针结果进行类型转换。它是一种与所有指针类型兼容的 void 类型。

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2013-09-01
      • 2014-03-11
      • 2018-12-25
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多