C-尝试删除链接列表中的第一个节点时出现双重自由错误

时间:2016-04-24 21:01:25

标签: c pointers memory-leaks linked-list

我试图编写一个从链表中删除节点的删除功能。结构和功能定义如下:

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>,我就不明白为什么会导致问题。第二个节点。有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

根据您的评论,您将其称为:

delete_from_list(dog_list);

在删除第一个元素的情况下,这不起作用,因为在这种情况下delete_from_list将返回新的列表头(以前是列表的第二个元素),但是{{调用者中的1}}仍将指向现在删除的前第一个元素。您需要做的就是将其更改为:

dog_list

这样dog_list = delete_from_list(dog_list); 将在调用者中更新,并且不再指向已删除的列表元素。