不插入并且不保留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;
};
答案 0 :(得分:2)
nn->prev = list; // 1
list->next = nn; // 2
nn->next = first; // 3
第1行和第2行在两个方向上将nn
与list
相关联,但第3行仅在一个方向上将nn
与first
相关联。你缺少相反的链接更新:
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类型。