我在删除链接列表中的第一个节点时遇到问题,当我删除其他节点成功后打印结果,但删除第一个节点时,它会打印0和结构的最后两个成员。
该函数应该传递一个指向链表的指针,提示用户输入一个ID号以查找删除节点,然后返回列表。
@supervisor_alerts = @alerts.where(@alerts(:employee_id)
= @employees(:employee_id))
这是之后打印链表的功能
struct dog *delete_from_list(struct dog *dogs){
int num;
printf("Enter a dogs ID number to be deleted ");
scanf("%d", &num);
struct dog *prev, *cur;
for(cur = dogs, prev = NULL;
cur !=NULL && cur->number != num;
prev = cur, cur = cur->next);
if (cur == NULL){
printf("Dog not found");
return dogs;
}
if( prev == NULL){
dogs = dogs->next;
printf("Dog deleted");
}
else{
prev->next = cur->next;
}
free(cur);
return dogs;
}
}
答案 0 :(得分:0)
你的功能显然工作正常(修改它以接受num作为我的参数...),关于它的实际意图。
你没有得到的是输出"狗被删除"如果你不删除头 - 这是因为你没有实现这样做。试试这个:
if (!cur)
{
puts("Dog not found");
return dogs;
}
if(!prev)
{
dogs = dogs->next;
puts("head deleted"); // <- changed "dog" -> "head"
}
else
{
prev->next = cur->next;
puts("dog deleted"); // <- added by me!
}
重要的是:你绝对需要这样称呼它(在他的评论中表示为BLUEPIXIY):
dogs = delete_from_list(dogs);
如果你不这样做,你的外部变量&#39;狗&#39;不会改变,并将指向已删除的内存。如果您仍然使用当时的悬空指针,则会出现未定义的行为,很可能是访问冲突(分段错误)。
为避免出现此类问题,您可能希望将指针传递给指向函数的指针。然后,返回值被释放,您可以使用它来指示狗实际上是否已被移除:
bool // need to #include <stdbool.h> for
delete_from_list(struct dog** dogs)
// ^
您现在在内部使用*dogs
代替dogs
并将其称为:
delete_from_list(&dogs);
优点:用户无需关心正确的重新分配...