Вставляет ли следующая функция и вызов функции «сиденье» после «сиденье водителя»

#c #function #object #pointers

Вопрос:

Я относительно новичок в программировании на c и работаю над сложным проектом для одного из моих классов. Мне нужно знать, работает ли мое определение моей функции insertAfter так, как задумывалось, и правильно ли я ее использую.

 void SeatNode::insertAfter(SeatNode* node)
{
    // insert this->SeatNode after node
    this->next_node = node->next_node;
    node->next_node = this->next_node;
}

void Compact::createSeatReservation(Passenger p)
{
    SeatNode seat(p);
    seat.insertAfter(this->driver_seat.getNextNode());
}
 

Если это работает по назначению, Compact::createSeatReservation(Пассажир p) должен создать объект SeatNode с именем seat и вставить сиденье после объекта SeatNode с именем driver_seat. Формирование связанного списка с driver_seat в качестве головного узла и местом в качестве следующего узла после driver_seat. Как я уже сказал, я относительно новичок в c , любая помощь будет признательна.

Комментарии:

1. Нет, это не так. Прокрути это в своей голове. Подумайте о трех узлах: вашем driver_seat узле, driver_seat следующем узле s и вашем недавно созданном узле. На что next указывает каждый из них и на что он должен указывать?

Ответ №1:

Нет, это не так. Я пройду через это шаг за шагом, начиная с точки, которую вы называете insertAfter():

  1. Вы меняете следующий указатель сиденья на тот, который находится после водителя, пока все хорошо.
  2. Вы меняете следующий указатель водителя на следующий указатель сиденья, который является указателем, который вы только что изменили на указатель после водителя на шаге 1, поэтому это назначение ничего не меняет.

Что вы хотите сделать во втором задании, так это изменить следующий указатель водителя на только что вставленное сиденье, что вы можете сделать следующим образом: node->next_node = this;

Существует также проблема внутри метода createSeatReservation (): когда вы вызываете insertAfter() с узлом после драйвера, новое место будет вставлено после места, которое само по себе находится после драйвера. Здесь правильная строка будет: seat.insertAfter(this->driver_seat);

Таким образом, полный правильный код будет

 void SeatNode::insertAfter(SeatNode* node)
{
    // insert this->SeatNode after node
    this->next_node = node->next_node;
    node->next_node = this;
}

void Compact::createSeatReservation(Passenger p)
{
    SeatNode seat(p);
    seat.insertAfter(this->driver_seat);
}