2016-09-23 7 views
0

この関数を正しく動作させることができません。特定のレコードを削除しようとするとクラッシュします。期待どおりに動作するためには、何を変更する必要がありますか?リンクされたリストから単一の学生を削除する

//Delete Students Function 
void delete_single_Student(Student *pfirst, int id) 
{ 
    int search_id; 
    bool found = false; 

    Student *pcurrent = pfirst; 
    Student *temp = NULL; 


    printf("Please enter the student ID of the student that will be deleted.\n"); 
    scanf("%d", &search_id); 

     while (search_id < 999 || search_id > 9999) 
     { 
      printf("\nPlease enter a valid id.\n"); 
      scanf("%d", &search_id); 
     } 
      do 
      { 
       temp = pcurrent; 
       pcurrent = pcurrent->next; 

       if (pfirst->id == search_id) 
       { 
        found == true; 
        printf("**********************\n\n"); 
        printf(" Student %d Deleted \n\n", search_id); 
        printf("*********************\n\n"); 
        pfirst = pfirst->next; 
        free(temp); 
        break; 
       } 

      } while (found != true); 
} 
+0

あなたは 'temp'で何をしていますか? 「発見された」旗には何が起こりますか? – t0mm13b

+0

「id」とは何ですか? – melpomene

+0

ユーザ入力に 'scanf'を使用しないでください。 – melpomene

答えて

1

pfirstを照会していますが、通常はループ内でpfirstを変更していないことに注意してください。最初の要素があなたの結果である場合、条件付きは真になります。さらに、found!= trueは常に真であるため、リストを移動した後にpcurrent nullポインタで終わるようにバインドされ、pcurrrent->次に参照すると、あなたは爆弾を送ります。

簡単な問題で徐々に攻撃することをお勧めします。

1)ポインタがnullのときに終了して、各要素を出力する手順を書いてください。見つかった変数は必要ありません。

2)番号1を繰り返しますが、その要素を前の要素と並べて印刷するため、前の要素を追跡する必要があります。

3)マスタリング#2を実行すると、最初の要素は特殊なケースであり、呼び出し元関数が持っていた情報にアクセスできない場合は、実際に問題を解決できないことがわかります。

+0

これは私が今取得しているものです 学生ID:529424(4444でし​​た) 名前: 名前: 年齢:31 – Ellejota

関連する問題