【发布时间】:2016-08-18 03:39:23
【问题描述】:
我正在尝试编写一个从链表中删除节点的删除函数。结构和函数定义如下:
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 的新头移动到第二个节点会导致问题。谁能帮帮我?
【问题讨论】:
-
问题可能出在这个函数的调用上。在调用者中,您确定要使用此函数返回的值更新列表头吗? IE。
dogs = delete_from_list(dogs); -
当我调用函数时,我有一个指针
*dog_list,它指向狗。这就是我所拥有的delete_from_list(dog_list);。 -
调试器.......
-
那是你的问题。您调用该函数来删除第一个元素。该函数正确地返回了新的列表头,但调用者丢弃了它,所以它现在指向被删除的节点。改成
dog_list = delete_from_list(dog_list);,问题就消失了。 -
成功了!太感谢了! :D
标签: c pointers memory-leaks linked-list