2016-04-24 3 views
0

Я пытаюсь написать функцию удаления, которая удаляет узлы из связанного списка. Структура и определение функции приведены ниже:C- Двойная ошибка при попытке удалить первый узел в связанном списке

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 ко второму узлу. Может ли кто-нибудь помочь мне, пожалуйста?

+0

Проблема может быть в вызове этой функции. В вызывающем устройстве вы уверены, что обновляете головку списка со значением, возвращаемым этой функцией? То есть 'dogs = delete_from_list (dogs);' –

+0

Когда я вызываю функцию, у меня есть указатель '* dog_list', который указывает на собак. Это то, что у меня есть 'delete_from_list (dog_list);'. – salmon1407

+0

Отладчик ............... –

ответ

0

За свой комментарий, вы вызываете это как:

delete_from_list(dog_list); 

Это не работает в том случае, когда удаляется первый элемент, так как в этом случае delete_from_list возвращает новый глава списка (который ранее был вторым элементом списка), но dog_list в вызывающем абоненте будет по-прежнему указывать на прежний первый элемент. Все, что вам нужно сделать, чтобы исправить это изменить это:

dog_list = delete_from_list(dog_list); 

Таким образом dog_list будет обновляться в вызывающем и больше не указывает на удаленный элемент списка.

Смежные вопросы