У меня проблема со следующим кодом. Мне нужно сначала найти запись, а затем удалить ее:
Это всегда удаляет последнюю запись. Даже если я хочу удалить первый любой rcord в середине
string NameForSearch1;
cout<<"Enter Your Friend's Name: "<<endl;
cin>>NameForSearch1;
tempRec->namePerson=NameForSearch1;
if (tempRec==firstRec){//delete the head
tempRec->next=firstRec;
firstRec=tempRec->next;
delete tempRec;
DisplayRec();
}
else if (tempRec->next==NULL ){//delete the last record
tempRec2=firstRec->next;
while(tempRec2->next!=tempRec){
tempRec2 = tempRec2->next;
}
tempRec2->next=NULL;
delete tempRec;}
else {
//delete anyrecord
tempRec2=firstRec->next;
while(tempRec2->next!=tempRec){
tempRec2 = tempRec2->next;
}
tempRec2->next=tempRec->next;
delete tempRec;
}
Проблема здесь:
tempRec2=firstRec->next;
while(tempRec2->next!=tempRec){
tempRec2 = tempRec2->next;
}
Чтобы найти удаляемый узел, вы сравниваете адрес узла. поскольку tempRec
это другой объект, который вы никогда не найдете в связанном списке.
Вместо этого вы должны сравнивать NameForSearch1
с данными в каждом узле.
Кроме того, ваше условие цикла плохо сконструировано, так как оно позволяет вам пройти за конец списка. Вы должны убедиться, что вы не достигли конца списка.
После нескольких часов отладки я наконец смог получить правильный код:
string NameForSearch1;
cout<<"Enter Your Friend's Name: "<<endl;
cin>>NameForSearch1;
tempRec=firstRec;
if (tempRec->namePerson==NameForSearch1){//delete the head
firstRec=tempRec->next;
delete tempRec;
DisplayRec();
}
else
{
while (tempRec!=NULL && tempRec->namePerson!=NameForSearch1){
tempRec2=tempRec;
tempRec=tempRec->next;
}
if (tempRec==NULL)
{
cout<<"NO RECORD FOUND";
}
else if (tempRec->namePerson==NameForSearch1)
{
tempRec2->next=tempRec->next;
delete tempRec;
}
}