我试图编写一个从链表中删除节点的删除功能。结构和功能定义如下:
struct dog{
int number;
char dog_name[NAME_LEN+1];
char owner_last_name[NAME_LEN+1];
char breed[NAME_LEN+1];
struct dog *next;
};
struct dog *delete_from_list(struct dog *dogs)
{
struct dog *cur, *prev;
int delete_number;
printf("\nEnter the patient number of the dog you want to delete: ");
scanf("%d", &delete_number);
for(cur = dogs, prev = NULL; cur != NULL && (cur->number != delete_number);
prev = cur, cur = cur->next)
;
if(cur == NULL)
{
printf("Dog not found.\n"); /*dog not found in list*/
return dogs;
}else if(prev==NULL)
{
dogs = dogs->next; /*dog now points to the second node*/
}else
prev->next = cur->next; /*dog is in another node*/
printf("Deleted: Dog name: %s, Breed: %s, Owner's last name: %s\n",
cur->dog_name, cur->breed, cur->owner_last_name);
free(cur);
return dogs;
}
当我运行程序时,删除功能一直有效,直到我尝试删除第一个节点。我使用了我的调试器,发现dogs = dogs->next;
是发生错误的地方,但是如果我将dogs
的新头移到了<script>
,我就不明白为什么会导致问题。第二个节点。有人可以帮帮我吗?
答案 0 :(得分:0)
根据您的评论,您将其称为:
delete_from_list(dog_list);
在删除第一个元素的情况下,这不起作用,因为在这种情况下delete_from_list
将返回新的列表头(以前是列表的第二个元素),但是{{调用者中的1}}仍将指向现在删除的前第一个元素。您需要做的就是将其更改为:
dog_list
这样dog_list = delete_from_list(dog_list);
将在调用者中更新,并且不再指向已删除的列表元素。