2016-04-18 22 views
-3

私のコードは、ユーザがポインタの配列から削除したい名前をタイプするようにユーザに促し、リンクされたリストを検索して名前を削除します。しかし、私のコードは、配列の最後のものを除いて、ポインタの配列内のすべての名前を削除しています。ここに私の削除機能があります。私のコードのこの部分の助けが必要です

int delete (studPtr *sPtr, Student myStud) 
{ 

    studPtr previous = NULL; 
    studPtr current = NULL; 
    studPtr temp = NULL; 
    while ((*sPtr)->nextPtr != NULL) 
    { 
     //previous = *sPtr; 

     if ((*sPtr)->name == myStud.name) 
     { 
      temp = *sPtr; 
      (*sPtr) = (*sPtr)->nextPtr; 
      current = (*sPtr); 
      previous->nextPtr = current; 
      free(temp); 

     } 
     else 
     { 
      previous = *sPtr; 
      (*sPtr) = (*sPtr)->nextPtr; 
     } 


    } 
    return 1; 


} 

そして、ここでポインタ

char *studentname[] = { "Abbie", "Oakley", "Sylvia", "Uwe", "Ken", "Aaron", "Fabien",'\0' }; 

の私の配列であり、これは関数を呼び出します。

printf("Enter students name: \n"); 
scanf("%s", Stud.name); 
int convert_char = determineIfConvert(Stud.name); 
if (convert_char == 1) 
{ 
    convert(Stud.name); 
} 
int delete_student = delete(&startPtr, Stud); 
if (delete_student == 1) 
{ 
    printf("student deleted"); 
    printList(startPtr); 
} 
else 
{ 
    printf("student not found\n"); 
} 
+0

コンパイラの警告を有効にし、valgrindなどを使用します。また、デバッガも便利です。 – Olaf

+0

クリスタルボールはあなたが 'strcmp()'について知らないと言っています。 – EOF

+0

@EOFあなたのクリスタルボールを使って私の決勝戦を見ることができますか? – Kiloreux

答えて

1

(*sPtr)->nextPtrは、そのインスタンスにNULLで、whileループが終了しますとif ((*sPtr)->name == myStud.name)のdoesntが実行されますので、配列の最後の要素は削除取得されません。 これを解決するにはdo whileループを使用できます。do whileループの前に、(* sPtr)がNULLかどうかをチェックする必要があります。

関連する問題