[英]C doubly linked circular list insert
不插入也不保留下一個和上一個節點的地址:我正在嘗試從文件讀取輸入; 它可以核心地讀取所有數據,並基於每一行,創建一個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;
};
nn->prev = list; // 1
list->next = nn; // 2
nn->next = first; // 3
線路1和2連接nn
到list
在兩個方向上,但第3行鏈路nn
與first
僅在一個方向。 您缺少此處相反的鏈接更新:
first->prev = nn;
我在這里看到一些問題。 首先是:
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;”。 這種工作方式是,您有一個指向數據的指針,並且有一個指向當前節點的指針,以及當前節點之后的節點存在,我們稱之為藍色。 因此,您將下一個數據設置為指向藍色,將上一個數據設置為指向curr。 然后,將上一個設置為藍色以指向數據,然后下一個設置為curr指向數據。 然后,列表插入完成。 還有一個特殊的情況,這個問題沒有解決,就是在列表末尾插入。 但我會將其留給讀者練習。
我注意到了另一件事。 無需強制轉換malloc的指針結果。 這是一個與所有指針類型兼容的void類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.