Ошибки при попытке удалить заголовок или узел посередине связанного списка - PullRequest
0 голосов
/ 16 октября 2019

Я знаю, где что-то не так, но я не знаю, как это изменить. Помогите, пожалуйста! Единственная работа - это (CurrentNode->next == NULL), в противном случае другой не делает. Что я могу сделать?

void Restaurant::deletereservation()
{
    string name;        
    cout << "Enter name of customer that you want to delete: " << endl
    << "Name: ";
    cin.ignore(80, '\n');
    getline(cin, name);
    ReservationNode *nodeIn = head;           
    ReservationNode *CurrentNode = head->next;  
    while ((CurrentNode != NULL) && (CurrentNode->Name != name))
    {
        nodeIn = CurrentNode;
        CurrentNode = CurrentNode->next;
    }
    if (CurrentNode->Name != name){
        cout << "Error!!!" << name << " is not found.Cant be deleted if there is no such person." << endl;
    }
    else{
        if (nodeIn == head){
            CurrentNode = head->next;
            CurrentNode = head;
            delete nodeIn;          

        }
        else if(CurrentNode->next == NULL){
            nodeIn ->next = NULL;
            delete CurrentNode;             
        }
        else{
            nodeIn -> next = CurrentNode->next;
            delete CurrentNode; 
        }       
    }

}

Ответы [ 2 ]

1 голос
/ 16 октября 2019

1: этот

ReservationNode *nodeIn = head;           
ReservationNode *CurrentNode = head->next; 

не определен, если список пуст.
Вы можете просто вернуться, если он есть.

2: если узел не найден вэтот цикл:

while ((CurrentNode != NULL) && (CurrentNode->Name != name))

CurrentNode будет нулевым после цикла, но вы идете прямо и безоговорочно разыменовываете его:

if (CurrentNode->Name != name){

Этот тест должен быть

if (CurrentNode == NULL){

3: Это

if (nodeIn == head){
    CurrentNode = head->next;
    CurrentNode = head;
    delete nodeIn;          
}

эквивалентно

if (nodeIn == head){
    CurrentNode = head;
    delete head;
}

, а затем head указывает на узел, который вы только что уничтожили.

Это должно быть

if (nodeIn == head){
    CurrentNode = head;
    head = head->next;
    delete CurrentNode;
}

Примечание: все становится намного проще, если вы отделяете взаимодействие пользователя с манипулированием данными.

Создайте элемент, который берет имя и удаляет соответствующую запись.
Оставьте получение, котороеимя основной программе.

0 голосов
/ 16 октября 2019

Я не уверен, что это правильно, потому что отсутствует значительная часть кода.

void Restaurant::deletereservation()
{
    string name;        
    cout << "Enter name of customer that you want to delete: " << endl
    << "Name: ";
    cin.ignore(80, '\n');
    getline(cin, name);
    ReservationNode *nodeIn = nullptr;           
    ReservationNode *CurrentNode = head;  
    while ((CurrentNode != NULL) && (CurrentNode->Name != name))
    {
        nodeIn = CurrentNode;
        CurrentNode = CurrentNode->next;
    }
    if (CurrentNode == nullptr || CurrentNode->Name != name){
        cout << "Error!!!" << name << " is not found.Cant be deleted if there is no such person." << endl;
        return;
    }

    if (CurrentNode == head) {
        head = CurrentNode->next; // Cut off list head (CurrentNode)  
    }
    else{
        nodeIn->next = CurrentNode->next; // Make the list "skip" CurrentNode
    }
    delete CurrentNode;       
}  
...