以下代码无法编译(由于显而易见的原因,代码是部分/修改的代码)
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,那么在函数中如何释放数组列表中的指针? (如何消除段错误?)
最佳答案
考虑一下 listg
是 list
的数组。
那么,&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/