C双重链接循环列表插入

时间:2015-05-15 12:30:00

标签: c linked-list insert circular-list

不插入并且不保留next和prev节点的地址:我试图从文件中读取输入;它可以核心地读取所有数据并基于每一行,创建一个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;
};

2 个答案:

答案 0 :(得分:2)

        nn->prev = list;   // 1
        list->next = nn;   // 2
        nn->next = first;  // 3

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

        first->prev = nn;

答案 1 :(得分:0)

我在这看到一些问题。首先是:

     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;"它的工作方式是你有一个指向数据的指针,你有一个指向当前节点的指针,以及当前存在的节点,我们称之为蓝色。因此,您将数据中的下一个设置为指向蓝色,并将数据中的prev指向curr。然后将prev设置为蓝色指向数据,接下来设置为curr指向数据。然后完成列表插入。还有一个特殊情况,即没有解决这个问题,即在列表末尾插入。但我会将其作为读者的练习。

我注意到了另一件事。没有必要对malloc的指针结果进行类型转换。它是一种与所有指针类型兼容的void类型。