删除函数是随机化链表的值
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);
我用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);