Программа не выводит заявки на авиабилеты

При запуске программы надо ввести по умолчанию первую заявку на авиабилеты, затем будет меню, где нужно выбрать определённую цифру (1 - добавить заявку, 2 - вывести все заявки, 5 - выход). Добавляю ещё одну заявку. После того, как нажимаю на цифру 2, программа ничего не выводит. Если нажать на цифру 5, то программа долго завершает работу. В чём может быть дело?

Мой код:

struct Airport {
    string destination;
    int flight_number;
    string surname_and_initials;
    string departure_date;
    Airport *next;
};

class Stack {
    // Нижняя и верхняя границы стека
    enum {EMPTY = -1, FULL = 1000000};

    // Указатель на вершину стека
    int top;        

    // Массив для хранения данных
    Airport* data = new Airport;

    public:
        // методы определены, но я их не указал для сокращения кода
};

// Прототипы функций
int Menu();

// Конструктор
Stack::Stack() {
    top = EMPTY;
}

// Добавление заявки в список
void Stack::Push(Airport* first) {
    // Если в стеке есть место, то увеличиваем указатель
    // на вершину стека и вставляем новый элемент
    if (!IsFull()) {
        Airport *t;
        Airport *tmp = new Airport;

        cout << "Введите пункт назначения - ";
        getline(cin, tmp->destination);
    
        cout << "Введите номер рейса - ";
        cin >> tmp->flight_number;
        cin.ignore();
    
        cout << "Введите фамилию и инициалы пассажира - ";
        getline(cin, tmp->surname_and_initials);
    
        cout << "Введите дату вылета - ";
        getline(cin, tmp->departure_date);

        data[++top] = *tmp;
        t->next = tmp;
    }
}

// Вывод всех заявок
void Stack::printRequests(Airport *first) {
    for (int i = 0; i < top; i++) {
        cout << "--------------- Билет " << i + 1 << " ---------------";
        cout << "Пункт назначения: " << data[i].destination << endl;
        cout << "Номер рейса: " << data[i].flight_number << endl;
        cout << "Фамилия и инициалы пассажира: " << data[i].surname_and_initials << endl;
        cout << "Дата вылета: " << data[i].departure_date << endl << endl;          
    }
}

int main() {
    setlocale(LC_CTYPE, "rus");
    Stack st;
    Airport *first = new Airport;
    first->next = NULL;

    cout << "Введите пункт назначения - ";
    getline(cin, first->destination);

    cout << "Введите номер рейса - ";
    cin >> first->flight_number;
    cin.ignore();

    cout << "Введите фамилию и инициалы пассажира - ";
    getline(cin, first->surname_and_initials);

    cout << "Введите дату вылета - ";
    getline(cin, first->departure_date);

    short k;

    while ((k = Menu()) != 5) {
        switch(k) {
            case 1: 
                st.Push(first);
                break;
            case 2: 
                st.printRequests(first);
                break;
            case 5: 
                break;
        }
    }
    
    delete[] first;

    return 0;
}

int Menu() {
    cout << "\n";
    cout << "1 - Добавить заявку\n";
    cout << "2 - Вывести все заявки\n";
    cout << "3 - Удалить заявку\n";
    cout << "4 - Вывести заявку по номеру рейса и дате вылета\n";
    cout << "5 - Выход\n";
    cout << "Введите нужный пункт: ";
    
    short k;
    cin >> k;
    cin.ignore();
    cout << "\n";
    return k;
}

Результат выполнения у меня такой:

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Запустил вашу программу. Для этого её пришлось немного подправить, в оригинальном виде она не запускалась. Чтобы не было разночтений, вот список изменений:

  1. Добавил заголовки для iostream и string и директиву using namespace std;. Иначе не компилируется.

  2. Объявил конструктор Stack::Stack и методы Stack::Push, Stack::IsFull, Stack::printRequests в классе. Их не было.

  3. В реализациях Stack::Push и Stack::printRequests убрал имя параметра first. Он не используется.

  4. Привёл результат вызова Menu() к short. Вообще ни на что не влияет, но компилятор упирается.

  5. Убрал декларацию Airport *t; и оператор t->next = tmp;. Компилятор жаловался на запись по не инициализированному указателю. Это серьёзное изменение: ваш вариант портил произвольную память, исправленный так не делает, что может исказить результаты моих тестов.

  6. Исправил delete[] first; на delete first;. Компилятор жаловался что так нельзя удалять скалярные указатели.

  7. Добавил реализацию и объявление метода Stack::IsFull. Его нигде не было, но я поискал в ваших предыдущих вопросах и нашёл.

Так вот, теперь я смог запустить вашу программу. valgrind обнаружил всего две утечки памяти. Но они на результат не влияют, а других ошибок не было.

Тест полностью воспроизвёл поведение, которое вы описали в вопросе.

Теперь можно ответить на ваш вопрос: "Где печать?".

Печати нет, потому что записи печатаются от нуля до значения переменной top минус один (условие в цикле i < top). top в начале равна -1. Один раз она инкрементируется в методе Stack::Push и становится равной нулю. А раз она ноль, печатать нечего.

P.S. Здесь я собирался сказать много ласковых слов про ваш стиль написания программ и задавания вопросов. Но сдержался. С трудом.

→ Ссылка