Отображение связанного списка смежности C++

Я создал связанный список смежности, чтобы показать рейсы между городами. Программа читает из 2-х файлов, один из которых содержит названия городов, а другой содержит пункты отправления и назначения разных рейсов. Я создал массив для обслуживаемых городов и связанный список соединяющихся городов для каждого индекса города в массиве. Однако у меня возникли проблемы с распечаткой списка. Мой выход выглядит так:

Origin --  Dest     ---      Flight No. --       Price  

NYC    ---          Chicago  --        3123   ----             123  
NYC    ----        Miami    ----        2123      ----          543    
NYC         ----     Seattle   ---       9283        ----        243  

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

Вот мой код для структуры и прочего:

 struct flight
 {
       int fNumber;
       string source;
       string dest;
       int price;    
 }

оператор перегрузки для вывода p.source — это источник, p.dest — пункт назначения и т. д.

 ostream& operator<<(ostream & os, const flight & p)
 {
       os <<"From "<< p.source << " to: ";
       int diff=0;
       diff= 35- p.source.length();
       os << fixed<< setw(diff)<<right<< p.dest;
       os << setw(10)<<right<<p.fNumber;
       os << setw(10)<<right<<p.price;
       return os;
 }

и функция отображения

void flightMap::display()
{
      cout<<setw(15)<<"Origin   "<<setw(30)<<"Destination"<<setw(12)<<"Flight     "<<setw(13)    <<"Price     "<<endl;
      cout<<"================================================================="<<endl;

      for (int i=0; i<number;  i++)
      {
            flightRecord[i].display();
      }
}

Я хочу, чтобы мой вывод выглядел так

Origin Dest Flight No. Price

NYC Chicago 3123 123  
  ----   Miami 2123 543  
  ----  Seattle 9283 243  

person Jason Lee    schedule 26.04.2013    source источник


Ответы (1)


Вы можете это сделать, но, вероятно, потребуется небольшая реорганизация вашего кода. Первое, что должно измениться, это

ostream& operator<<(ostream & os, const flight & p)

Это стандартный способ печати, но здесь он недостаточно хорош, потому что нет способа указать этой функции, печатать исходный город или нет. Итак, давайте напишем другую функцию

void printFlight(ostream & os, const flight & p, bool printSource)
{
   if (printSource)
       os <<"From "<< p.source << " to: ";
   else
       os <<"From --- to: ";
   ...
}

Теперь вы можете использовать эту функцию в своем цикле, если помните, каким был последний исходный город, который вы напечатали. Если последний исходный город отличается от текущего исходного города, вы печатаете исходный город, иначе нет. Что-то вроде этого

string lastSource = "";
for (int i=0; i<number;  i++)
{
    printFlight(cout, flightRecord[i], flightRecord[i].source != lastSource);
    lastSource = flightRecord[i].source;
}
person john    schedule 26.04.2013
comment
Большое спасибо, Джон, ну, я удалил из p.source мой перегруженный оператор ‹‹, так что будут отображаться только последние 3 переменные, а затем я воспользовался вашим советом, создав последний исходный город в моем цикле, отлично работает, еще раз спасибо! - person Jason Lee; 26.04.2013