Главная arrow С++ (часть 2) arrow Удаление узла

Удаление узла

Другой путь генерации множественных решений — метод удаления узла (node removal) — просто удаляет последний узел из текущего решения и пытается снова найти решение. Для этого в функцию main () внесены изменения, позволяющие удалить последний рейс текущего решения из базы данных, очищать все поля skip и получать новый пустой стек, использующийся для хранения следующего решения. Новая версия функции main о приведена в листинге 7.5.
Листинг 7.5. Функция main() для получения множественных решений с помощью удаления узла
// Версия для удаления узлов, int main ()  {
char to[40], from[40];
Search ob;
Flightlnfo f;
// Добавляет рейсы в базу данных, ob.addflight("New York",  "Chicago", 900); ob.addflight("Chicago",  "Denver", 1000); ob.addflight("New York",  "Toronto", 500); ob.addflight("New York",  "Denver",  1800); ob.addflight("Toronto",  "Calgary", 1700); ob.addflight("Toronto".  "Los Angeles", 2500); ob.addflight("Toronto",  "Chicago", 500); ob.addf1ight("Denver",  "Urbana", 1000); ob.addflight("Denver",  "Houston",  1000); ob.addf1ight("Houston",  "Los Angeles",1500); ob.addflight("Denver",  "Los Angeles", 1000);
// Получает пункты отправления и назначения, cout « "From? ";
cin.getline(from, 40); cout « "To? ";
cin.getline(to, 40);
// Находит множественные решения. for(;;) {
// Проверяет, есть ли рейс.
ob.findroute(from, to);
// Если не найден ни один новый маршрут, завершается, if(!ob.routefound()) break;
// Сохраняет рейс на вершине стека (on top-of-stack). f = ob.getTOSO ;
ob.route(); // отображает текущий маршрут
ob.resetAllSkipO ; // переустанавливает поля skip
// Удаляет из базы данных последний рейс //из предыдущего решения, ob.remove(f);
}
return 0;
)
Для удаления последнего рейса, включенного в предыдущее решение, Функция main о получает его с помощью вызова функции gecTOSO, кото-Рая объявлена как встроенная функция в классе Search. II Возвращает рейс из вершины стека. PlightInfo getTOSO  { return btStack.top();
}
Функция getTOso возвращает информацию о последнем рейсе маршрут хранящемся на вершине стека возврата.
Для действительного удаления этого рейса функция main о   вызывает функцию remove (), приведенную далее. // Удаляет рейс.
void Search::remove(Flightlnfo f)  (
for(unsigned i=0; i< flights.size(); i++) if(flights[i].from == f.from && flights[i].to == f.to) flights[i].from = "";
}
Удаление рейса заключается в присваивании пустой строки переменной from, содержащей название пункта отправления.
Для   очистки    полей    skip   функция   main о    вызывает   функцию resetAilskip (), приведенную далее. // Переустанавливает все поля skip, void Search::resetAllSkip()  {
for(unsigned i=0; i< flights.sizeO; i++) flights[i].skip - false;
}
Функция resetAilskip о просто присваивает всем полям skip значение
false (не забудьте Добавить ПРОТОТИПЫ ДЛЯ функций resetAilskip () и remove () В раздел объявления класса Search).
Поскольку внесено достаточно много изменений, для большей наглядности программа с применением метода удаления узла приведена полностью в листинге 7.6. Обратите внимание на то, что она тоже использует первоначальную программу поиска в глубину из листинга 7.1.