【发布时间】:2023-02-10 01:00:06
【问题描述】:
下面的函数(在 c 中)用于删除双链表的部分内容 (双链表 = 来回指向的列表)。 从链接列表的中间(此函数的底部)删除按预期工作(我不必返回新列表,因为函数终止时列表会自动更新)
但是,当从列表的开头或列表的结尾(此函数的顶部和中间部分)删除时,此函数要求我返回新的...这让我感到困惑,因为通过指针传递函数是按值传递因此应该'传递的列表(在此函数中命名为 new)自动更新
(如果需要其他先前的代码来回答让我知道我只是想查明让我感到困惑的区域)
node* delete(int x, node* new)
{
node *del = new;
for(int i = 0; i < x; i++)
{
del = del -> next;
}
// MEANING ITS THE FIRST ELEMENT OF THE LIST
if (del -> before == NULL)
{
// WE WANT TO MAKE DEL POINT TO DEL -> NEXT
// THEN WE WANT TO SET A POINTER TO DEL -> BEFORE
// THEN WE WANT TO SET DEL -> BEFORE TO NULL
// THEN WE WANT TO FREE THE NEW VARIABLE
del = del -> next;
node *rem = del -> before;
del -> before = NULL;
new = del;
free(rem);
return new;
}
// MEANING ITS THE LAST ELEMENT OF THE LIST
else if (del -> next == NULL)
{
// WE WANT TO SET DEL TO DEL -> BEFORE
// THEN WE WANT TO MAKE A NODE POINRING TO DEL -> NEXT
// THEN WE WANT TO MAKE DEL -> NEXT NULL
// THEN WE WANT TO FREE THE CREATED NODE
del = del -> before;
node* rem = del -> next;
del -> next = NULL;
free(rem);
return new;
}
// MEANING THE MIDDLE OF THE LIST
else
{
del -> before -> next = del -> before -> next -> next;
del -> next -> before = del -> next -> before -> before;
free(del);
return new;
}
}
问题未解决?
【问题讨论】:
-
即使在函数的最开始,这段代码 for(int i = 0; i < x; i++) { del = del -> next; } 可以调用未定义的行为。
-
该功能应该完全重写。例如这段代码 sn-p del = del -> next;节点 *rem = del -> 之前; del -> 之前 = NULL;也可以调用未定义的行为。那就是这个函数充满了错误。
-
x 是列表中需要删除的第 x 个元素……是的,新的是列表……这个函数有效,但只能通过返回新的
-
为什么那辆 sn-p 越野车?我正在设置 del -> next 因为我想保留下一部分并且我将一个新变量 *rem 设置为之前的位因为我希望能够在我设置 new = del 之后释放它因为我在 main 中使用了 malloc
-
del->next 可以是空指针。所以下一个表达式 del->before 调用未定义的行为。
标签: c