2016-08-24 18 views
0

指示:次の機能を実装して、姓で検索し、最初に一致する生徒をリンクリストから削除します。一致する生徒が見つかると、この関数は新しいリンクリストの先頭へのポインタを返します。一致する生徒が見つからない場合、リストは変更されず、リンクされたリストの先頭が返されます。一致するデータに基づいてノードを削除する

このコードをコンパイルして実行すると、毎回ヘッドノードが削除されるだけです。名前がリストの中央にある場合でも、リストにない場合でも、ヘッドノードは常に削除されます。何が間違っているのかは分かりません。どんな助けでも大歓迎です!ありがとう!ヒントについて

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
struct STUDENT* current = students; 
struct STUDENT* previous = NULL; 

while (current != NULL) { 
    if (current->Lastname == name) { 
    if (previous == NULL) { 
     current = current->Next; 
     free(students); 
     students = current; 
    } 
    else { 
     previous->Next = current->Next; 
     free(current); 
     current = previous->Next; 
    } 
    } 
    else { 
    previous = current; 
    current = current->Next; 
    } 
    return current; 
}  
return NULL; 

} 
+9

'current-> Lastname == name' - これは文字列を比較する方法ではありません。 'strcmp'ファミリーを使用してください。あなたには表示されない機能に同様の問題があると思われます。 –

+0

ヒント; '' char * name'は '' name''のポイントを変更しないので、 '' const char * name''でなければなりません。 – ikegami

答えて

0

ありがとう!私が興味を持った人のために働かなければならないコードはここにあります。

STUDENT *DeleteByLastName(STUDENT *students, char *name) 
{ 
struct STUDENT* current; 
struct STUDENT* head = students; 

current = students; 
int count = 0; 
struct STUDENT* previous = NULL; 

while (current != NULL) { 
    //check for matching head and delete 
    if (strcmp(current->Lastname,name) == 0 && count == 0) { 
     students = current->Next; 
     return students; 
    } 
    //If name matches but is not at the beggining of the list 
    if(strcmp(current->Lastname,name) == 0) { 
     previous->Next = previous->Next->Next; 
     current = current->Next; 
     return students; 
    } 
    else { 
     previous = current; 
     current = current->Next; 
     ++count; 
    } 
} 
return head; 
} 
関連する問題