删除函数是随机化链表的值

Remove function is randomizing the values of linked list

我用C 写了一个简单的链表,当我尝试删除列表的第一个节点时出现问题,只有第一个节点每隔一个节点都可以毫无问题地删除。这是我的代码:

struct LinkedList * search_ret_prev_node(struct LinkedList *lst, int data){
//function that return the node before the one that contains the value of "data"
}
    void remove_node(struct LinkedList *lst, int data){
        if(lst->data == data){
            if(lst->next == NULL){  free(lst);  }
            else{
                 struct LinkedList *temp = lst;
                 lst = temp->next;
                 free(temp);
            }
        return;
    }
    else{
        struct LinkedList *prev_node = search_ret_prev_node(lst, data);
        if(prev_node == NULL){return;}
        if(prev_node->next->next == NULL){
            free(prev_node->next); 
            prev_node->next = NULL;
        }
        еlse{
             struct LinkedList *temp= prev_node->next;
             prev_node->next = temp->next;
             free(temp);
       }
    }
}

int main(){
   struct LinkedList *list = malloc(sizeof(struct LinkedList));
   list->data = 4;
   list->next = NULL
 // adding a few nodes, let's say that the first one contains the number 7
   remove(list, 7);
}

现在正如我所说,问题是在我调用第一个节点上的删除函数后,它随机化列表,我得到类似于 21415135 的值,这些值不应该在列表中,可能我是访问另一个程序的内存。我已经删除了一些细节,因为如果我尝试删除与第一个不同的任何其他节点,该功能可以完美运行。知道为什么会这样吗?

Remove_node 应该 return (可能已更新)列表值,以便调用它的范围内的列表条目将保持有效。

一看就知道有问题了:

remove(list, 7);
//     ^

看到可疑的东西了吗?没错,没有符号!这意味着无论 remove 做什么, list 指针的值都不会改变,因为指针是按值传递的。因此,删除第一项不会以正确的方式更改列表:您最终会得到一个 悬空指针 .

有两种常见的解决方法:

  • 做一个"fake"第一个总是被忽略的节点,或者
  • 将指针传递给指向您的 remove 函数的指针。

我更喜欢第二种方法:

void remove(struct LinkedList **lstPtr) {
    ... // Add an extra level of dereference
}
...
remove(&list, 7);