删除链表中的第一个节点仍会在结果中显示节点

时间:2017-04-20 17:57:28

标签: c linked-list

我在删除链接列表中的第一个节点时遇到问题,当我删除其他节点成功后打印结果,但删除第一个节点时,它会打印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;

}

}

1 个答案:

答案 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);

优点:用户无需关心正确的重新分配...