删除功能是随机化链表的值

时间:2015-02-14 10:12:00

标签: c 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);
}

现在正如我所说的问题是,在我调用第一个节点上的remove函数后,它随机化列表,我得到类似于21415135的值,这些值不应该在列表中,可能我正在访问内存到另一个程序。我删除了一些细节,因为如果我尝试删除与第一个节点不同的任何其他节点,该功能正常工作。任何想法为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

您可以在看到此问题时立即知道问题:

remove(list, 7);
//     ^

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

有两种常见的解决方法:

  • 制作一个始终被忽略的“假”第一个节点,或
  • 将指针传递给指向remove函数的指针。

我更喜欢第二种方法:

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

答案 1 :(得分:0)

Remove_node应该返回(可能更新的)列表值,以便调用它的作用域中的列表条目保持有效。