Связанный список и передать по ссылке - PullRequest
0 голосов
/ 06 октября 2019

Мне нужно написать код для работы со связанными списками. Я немного смущен тем, что спрашивают. Я работаю с функцией deleteFront, которая, конечно, удаляет передний узел. Есть 3 сценария, о которых нужно позаботиться: 1) список уже пуст 2) в списке есть 1 узел и 3) все остальное. Я не совсем понимаю, что мне делать со сценарием 2. В инструкциях говорится следующее: «Отдайте элемент переднего узла через OldNum (передача по ссылке), удалите передний узел и обновите счетчик. Это то, что я имею для всех3 сценария. Может кто-нибудь помочь мне понять каждую строку кода, пожалуйста:

void llist::deleteFront(el_t& OldNum) {
    if (isEmpty()) {
        throw underflow()
    }
    else if (Count == 1) {              
        OldNum = Front->Elem;           
        Node *Second;                   
        delete Front;
        Count--;
    }
    else {
        OldNum = Front->Elem;
        Node *Second;
        Second = Front->Next;
        delete Front;
        Front = Second;
        Count--;
    }

}

1 Ответ

0 голосов
/ 06 октября 2019
void llist::deleteFront(el_t& OldNum) { 
    if (isEmpty()) {
        throw underflow()
    }

Если список пуст, мы выкидываем исключение (оно уведомит разработчика о том, что вызывающий код неправильно вызвал deleteFront() в уже пустом списке);

    else if (Count == 1) {              

В случаеесть один узел, который мы делаем следующим образом:

        OldNum = Front->Elem;           

Мы возвращаем элемент из только что удаленного узла вызывающей стороне, поскольку параметр Oldnum является ссылкой (&), которую мы можем сохранить элементпо этой ссылке и вызывающий будет иметь доступ к нему после завершения функции;

        Node *Second; // <- this is useless!!

Объявление указателя для нового узла, но он не используется, поэтому эта строка фактически ничего не делает (вы можете удалить его);

        delete Front;
        Front = NULL; //missing!!

Мы удаляем только существующий узел Front и занимаемую им память (вместе с полем elem и всеми другими, если они есть) освобождаются;обратите внимание, что вы должны добавить Front = NULL; для правильной аннулирования указателя Front, который теперь указывает на ничто;

        Count--;
    }

Мы уменьшаем Count на 1 (до 0) и заканчиваем.

    else {

В последнем случае, когда существует более 1 узла:

        OldNum = Front->Elem;

Мы возвращаем элемент точно так же, как и в предыдущем случае;

        Node *Second;
        Second = Front->Next;

Этот мынеобходимо временно «запомнить» следующий узел с именем Second (который будет первым с этого момента);

        delete Front;

Теперь мы удаляем узел First, его память освобождается;

        Front = Second;

Поскольку указатель Front всегда должен указывать на первый узел, мы переназначаем его с помощью Second (именно поэтому мы его запомнили);

        Count--;
    }

Мыуменьшить Count на 1 и завершить;Однако, как отметил Игорь, все это может быть уменьшено до:

if (isEmpty()) {
    throw underflow()
}
else {
    OldNum = Front->Elem;
    Node *Second;
    Second = Front->Next;
    delete Front;
    Front = Second;
    Count--;
}

Случай else будет обрабатывать также случай с одним узлом. Только значение NULL будет передано из Front->Next в указатель Front.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...