簡體   English   中英

C-從雙向鏈表中刪除任何節點

[英]C - Deleting any node from a doubly linked list

嘗試從雙鏈表中刪除Node時遇到麻煩。 雖然我通常可以刪除節點,但是當我嘗試刪除第一個元素時,它使我的程序崩潰並返回錯誤3221225477。

我用標題創建列表,如下所示:

typedef struct Inode2*Task;                                     
typedef struct Inode2{
        int ID;
        int Priority;
        int Status;
        char *Description;
        Person *person;
        Date   *creation;
        Date   *deadline;
        Date   *conclusion;                             
        Task next;
        Task previous;
    }Task_node2;    

Task TaskCreate()                                                                                                           {
    Task aux=(Task)malloc(sizeof(Task));
    aux->next=NULL;
    aux->previous=NULL;
    return aux;
}

據我所知,這是在創建帶有標題的列表,該標題已提供給我進行進一步操作。

我有一個函數可以在此列表的末尾插入一個節點。 這似乎工作得很好。

每當我在第一個元素上使用此刪除功能時,它就會崩潰:

int TaskRemove(Task h,int IDREMOVE)                                                                                         {
    int val;
    for(;h;h=h->next)
    {
        if (h->ID==IDREMOVE)
        {
            h->previous->next = h->next;
            val++;
            if (h->previous->previous==NULL)
            {
                h->previous->next = h->next;
            }
        }
    }
    if (val==0)
    {
        printf("\n\tNo node with such ID\n");
        sleep(1);
    }
    return val;
}

這適用於除最后一個元素之外的所有元素。 發生了什么? 提前致謝。

問題是您的代碼訪問一個雙向節點而不檢查相應的雙向節點是否存在。 刪除列表中的最后一個節點會給您帶來類似的問題。

您需要先對NULL -check每個指針應用->運算符。 具體來說,檢查h->previous->previous == NULL的代碼首先需要確保h->previous不為NULL 您需要NULL兩次檢查或賦值的所有位置添加對第一個指針的NULL檢查。

注意:您的代碼還有其他問題,例如, malloc(sizeof(Task))產生的內存大小不正確。 造成混淆的根本原因是Task是指針類型,但使用時不帶星號。 如果可能,應該避免這種情況,可以直接使用Inode2*或將Inode2重命名為Task以獲得更好的可讀性。

代碼的第一個問題是如何為節點分配內存。

Task aux=(Task)malloc(sizeof(Task));

這行分配內存的sizeof(Task)字節。 Task是一個指針,而不是實際的節點。 根據編譯器的不同,它很可能會為指針分配足夠的空間。 您應該使用以下內容為Inode2分配空間:

Task aux=(Task)malloc(sizeof(struct Inode2));

第二個問題是在這些行中:

h->previous->next = h->next;
val++;
if (h->previous->previous==NULL)
{
    h->previous->next = h->next;
}

對於第一個元素, h->previous應該為NULL ,因此,當您嘗試訪問h->previous->next ,程序將嘗試訪問NULL指針,這將導致崩潰。 在嘗試進一步訪問之前,必須檢查h->previous是否為NULL

筆記:

  • 如評論中所述, 請勿 typedef指針。
  • 您說它在第一個元素上崩潰,然后說它在除最后一個元素上的所有元素上都起作用。 我假設是前者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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