簡體   English   中英

C雙向鏈接循環列表插入

[英]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連接nnlist在兩個方向上,但第3行鏈路nnfirst僅在一個方向。 您缺少此處相反的鏈接更新:

        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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM