gpt4 book ai didi

c - 关于删除链表中的节点

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:12 25 4
gpt4 key购买 nike

以下代码无法编译(代码是部分/修改后的代码,原因很明显)

    typedef struct l_list{
int value;
struct l_list *next;
}list; // given

void delete(list **head, int value){ //given
...
free(current); // segmentation fault
...
}

int main() /// given for testcase
{
list listg[2];

// initialized 2 struct and link them with each other using next pointer one after another (think like arrayed linked list)

delete(&listg, 3);
}

error: cannot convert list (*)[2] {aka l_list (*)[2]} to list** {aka l_list**} for argument 1 to void delete(list**, int)

问题 1:编译帮助。请指教!

问题 2:如果我们必须像上面那样实现 delete,在函数中如何释放数组列表中的指针? (如何消除段错误?)

最佳答案

考虑 listglist 的数组。
然后,&listg 是一个指向list 数组的指针

delete() 期望在第一个参数中有 指向 list 的指针。所以,你有一个类型不匹配,因此编译器错误。这可以通过实际传递指向 list 的指针地址来纠正。

list listg[5] = {
{ 1, &listg[1] },
{ 2, &listg[2] },
{ 3, &listg[3] },
{ 4, &listg[4] },
{ 5, 0 } };
list *listp = listg;
delete(&listp, 3);

您不能在 malloc()(或其兄弟之一)未返回的指针值上调用 free()。这意味着您不能在自动内存、静态内存或动态分配中间的地址上调用 free()。但是,您可以从列表中删除与 3 关联的节点。

节点删除通常是通过操纵要删除的节点之前的节点的 next 指针远离其当前值并指向要删除的节点之后的节点来实现的。您将需要代码(可能是某种循环)来识别要删除的节点和完成此操作的前一个节点。如果您需要删除列表的第一个元素,可以通过将列表的头部更改为列表中的下一项来完成。

关于c - 关于删除链表中的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21872816/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com