2016-04-24 8 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の新しいヘッドを2番目のノードに移動すると、それがなぜ問題を引き起こすのか理解できません。誰でも私を助けてくれますか?あなたのコメントパー

+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は、新しいリストの先頭に戻りますので、これは、最初の要素が削除された場合には動作しません(これは以前はリストの2番目の要素でした)、呼び出し元のdog_listは、今削除された元の最初の要素を指しています。削除されたリスト要素に呼び出し側で更新されます

dog_list = delete_from_list(dog_list); 

その方法dog_listとしなくなりポイント:あなたはこれを修正するために必要なことは、これを変更しています。

関連する問題