以下例程应该在单个链表的开头删除节点,但有时会失败。
void remove_from_front(node *start)
{
delete start;
start = start->link;
print_list(start);
}
答案 0 :(得分:8)
我可以看到几个问题:
您正在释放start
节点,然后访问已释放的内存。这是不正确的,它会导致未定义的行为,这意味着任何事情都可能发生。在一次运行中它可能会起作用,在下一次运行中它可能会崩溃。
您的函数需要对列表的头部进行更改,但它不会使更改对被调用函数可见,因为它不返回任何内容,并且参数start
按值传递。要解决此问题,请传递start
指针的地址或引用。
您的功能可能会在空列表start = NULL
上调用。你需要处理这种情况。
正确实施:
void remove_from_front(node **start) {
// if list is empty..nothing to remove..return.
if(*start == NULL) {
return;
}
// save the address of the node following the start in new_start
node *new_start = (*start)->link;
// now delete the start node.
delete *start;
// new_start is now the new start of the list.
// And since start was passed by address, the change is reflected in the
// calling function.
*start = new_start;
}
答案 1 :(得分:5)
delete start
后,您无法安全地使用start
所指的内容。这就像放下一个风筝线,并希望以后能够再次抓住它 - 它可能会起作用,也可能不会。
答案 2 :(得分:-1)
您正在删除start,然后尝试通过获取其链接成员来取消引用它。那会崩溃,因为你刚刚删除它。你可能想要这样的东西:
node *temp = start;
start = start->link;
delete temp;
print_list(start);