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

标签 c linked-list

以下代码无法编译(由于显而易见的原因,代码是部分/修改的代码)

    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/

相关文章:

java - 从 Java 程序编译 C 程序

c - 链表中的字符串存储和比较

c - while 循环第二次运行时出现段错误

java - 对链接列表进行插入排序,数据来自文本文件。 java

c++ - 为什么我的列表在上次函数调用后发生了变化?

c - 删除最后一个链接列表

C: 如何检查何时 coord[xy] == coords[x][y]?

c - 如何让随机值函数每次返回不同的值

c++ - 这个表达是什么意思? (C 中的 SetConsoleTextAttribute 函数)

c - pidgin 中缺少 gstreamer 和 farsight 依赖项