我在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的值,这些值不应该在列表中,可能我正在访问内存到另一个程序。我删除了一些细节,因为如果我尝试删除与第一个节点不同的任何其他节点,该功能正常工作。任何想法为什么会发生这种情况?
答案 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应该返回(可能更新的)列表值,以便调用它的作用域中的列表条目保持有效。