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