Задание работы:
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования.
Для каждого поезда указывается:
□ номер поезда;
□ станция назначения;
□ время отправления.
Данные в информационной системе организованы в виде линейного списка. Написать программу, которая:
□ обеспечивает первоначальный ввод данных в информационную систему и формирование линейного списка;
□ производит вывод всего списка;
□ вводит номер поезда и выводит все данные об этом поезде;
□ вводит название станции назначения и выводит данные обо всех поездах, следующих до этой станции.
Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе.
Мой код:
Код:
#pragma once
#include <iostream>
#include <math.h>
#include <iomanip>
#include <conio.h>
using namespace std;
struct train {
int number;
char *name = new char;
float time;
train* next;
};
//поиск элемента в однонаправленном списке
bool Find(train* Head, int NumberItem) {
train *ptr; //вспомогательным указатель
ptr = Head;
while (ptr != NULL) {//пока не конец списка
if (NumberItem == ptr->number) return true;
else ptr = ptr->next;
}
return false;
}
//проверка на корректность введённого времени
bool Mistake(train* Head, float TimeItem)
{
float fractpart, intpart;
fractpart = modf(TimeItem, &intpart);
if ((intpart > 24) || (fractpart > 0.60) || (TimeItem < 0))
return true;
else
return false;
}
//вставка элемента с заданным номером в однонаправленный список
train* Make(train* Head, int Number) {
Number--;
train *NewItem = new(train);
cout << "Number of the train: ";
while (!(cin >> NewItem->number) || Find(Head, NewItem->number) == true)
{
cout << "This number is already listed!" << endl;
cout << "Enter number again: ";
}
cout << "Destination: ";
cin >> NewItem->name;
cout << "Arrival time: ";
while (!(cin >> NewItem->time) || Mistake(Head, NewItem->time) == true)
{
cout << "Time is entered incorrectly!" << endl;
cout << "Enter time again: ";
}
NewItem->next = NULL;
if (Head == NULL) {//список пуст
Head = NewItem;//создаем первый элемент списка
}
else {//список не пуст
train *Current = Head;
for (int i = 1; i < Number && Current->next != NULL; i++)
Current = Current->next;
if (Number == 0) {
//вставляем новый элемент на первое место
NewItem->next = Head;
Head = NewItem;
}
else {//вставляем новый элемент на не первое место
if (Current->next != NULL)
NewItem->next = Current->next;
Current->next = NewItem;
}
}
return Head;
}
//печать однонаправленного списка
void Print(train* Head)
{
if (Head == NULL)
cout << "List is empty!";
else
{
while (Head != NULL) {
cout << "Number" << "\t" << "Destination" << "\t" << "Arrival time" << "\t" << endl;
cout << Head->number << "\t" << Head->name << "\t" << "\t" << std::fixed << setprecision(2) << Head->time << endl;
Head = Head->next;
//переход к следующему элементу
}
}
}
//вывод элементов
void Show(train* Head)
{
cout << "Number" << "\t" << "Destination" << "\t" << "Arrival time" << "\t" << endl;
cout << Head->number << "\t" << Head->name << "\t" << "\t" << std::fixed << setprecision(2) << Head->time << endl;
}
//освобождение памяти, выделенной под однонаправленный список
void Delete(train* Head) {
if (Head != NULL) {
Delete(Head->next);
delete Head;
}
}
//поиск элемента (номера) в однонаправленном списке
void FindNumber(train* Head) {
train *ptr; //вспомогательным указатель
ptr = Head;
int NumberItem = 0;
cout << "Input train's number: ";
cin >> NumberItem;
while (ptr != NULL) {//пока не конец списка
if (NumberItem == ptr->number)
{
Show(ptr);
return;
}
else ptr = ptr->next;
}
cout << "No such train was found" << endl;
}
//поиск элемента(имени) в однонаправленном списке (Нужно что бы выводила данные обо ВСЕХ поездах, следующих до этой станции)
void FindTime(train* Head) {
train *ptr; //вспомогательным указатель
ptr = Head;
char *Name = new char;
cout << "Input station's name: ";
cin >> Name;
while (ptr != NULL) {//пока не конец списка
if (strcmp(Name, ptr->name) == 0)
{
Show(ptr);
return; //если убрать, будет выводить бесконечно данные первой структуры с данным именем
}
else ptr = ptr->next;
}
cout << "No such station was found" << endl;
}
int main()
{
train *Head = NULL;
int n = 1;
char cKey;
do {
system("cls");
cout << "1 - Add info about new train to the Database\n";
cout << "2 - Show Database\n";
cout << "3 - Show info about specific train\n";
cout << "4 - Show info about arriving trains to the station\n";
cout << "5 - Exit\n";
cKey = _getch();
system("cls");
if (cKey == '1') {
Head = Make(Head, n);
n++;
}
else if (cKey == '2')
Print(Head);
else if (cKey == '3')
FindNumber(Head);
else if (cKey == '4')
FindTime(Head);
else if (cKey == '5')
{
cout << "Goodbye" << endl;
Delete(Head);
}
else
continue;
_getch();
} while (cKey != '5');
system("pause");
return 0;
}
Суть проблемы:
Почему то не работает корректно поиск по названию станции.
Функция должна выводить данные обо ВСЕХ поездах, следующих до этой станции.
Выводит всего один раз с return; это понятно.
Но если убрать, будет бесконечно выводить данные о первом поезде с данным именем.
Собственно просьба помочь исправить )