#include <iostream.h>
#include <string.h>

class RailroadStation
{
public:
	typedef unsigned int UINT;
	typedef unsigned char BYTE;

	typedef struct tagTrainInfoList
	{
		BYTE Way;
		UINT TrainNum;
		UINT TimeArr;
		UINT TimeDep;
		char *StationSour;
		char *StationDest;
		struct tagTrainInfoList *next;
	} TrainInfoList;

	typedef struct tagTrainInfo
	{
		BYTE Way;
		UINT TrainNum;
		UINT TimeArr;
		UINT TimeDep;
		char *StationSour;
		char *StationDest;
	} TrainInfo; 

	RailroadStation()
	{
		Schedule = NULL;
	}

    TrainInfoList* GetTrainByNum(UINT TrainNum)
	{
        TrainInfoList *p = Schedule;
		TrainInfoList *Trains = NULL;

		while (p != NULL)
		{
			if (p->TrainNum == TrainNum)
				AddToList(Trains, p);
			p = p->next;
		}

		return Trains;
	}
	
	TrainInfoList* GetTrainByWay(BYTE Way)
	{
        TrainInfoList *p = Schedule;
		TrainInfoList *Trains = NULL;

		while (p != NULL)
		{
			if (p->Way == Way)
				AddToList(Trains, p);
			p = p->next;
		}

		return Trains;
	}	

    bool AddTrain(TrainInfo Train)
	{
		if (HasTrain(Train.TrainNum) || !WayEmpty(Train.Way, Train.TimeArr, Train.TimeDep))
			return false;

		AddToList(Schedule, Train);

		return true;
	}

    bool DelTrain(UINT TrainNum)
	{
		if (!HasTrain(TrainNum))
			return false;

		TrainInfoList *p = Schedule;

		while (p != NULL)
		{
			if (p->TrainNum == TrainNum)
			{
				DelFromList(Schedule, p);
				return true;
			}
			p = p->next;
		}
	}

    TrainInfoList* FilterSour(char *Station)
	{
		TrainInfoList *p = Schedule;
		TrainInfoList *Trains = NULL;

		while (p != NULL)
		{
			if (strcmp(p->StationSour, Station) == 0)
				AddToList(Trains, p);
			p = p->next;
		}
			
		return Trains;
	} 
	
	TrainInfoList* FilterDest(char *Station)
	{
		TrainInfoList *p = Schedule;
		TrainInfoList *Trains = NULL;

		while (p != NULL)
		{
			if (strcmp(p->StationDest, Station) == 0)
				AddToList(Trains, p);
			p = p->next;
		}
			
		return Trains;
	} 

	TrainInfoList* FilterArr(UINT Time1, UINT Time2)
	{
		TrainInfoList *p = Schedule;
		UINT t11, t1 = Time1, t2 = Time2; 
		TrainInfoList *Trains = NULL;
		
		while (p != NULL)
		{
			t11 = p->TimeArr;
			if (((t1 <= t2) && (t1 <= t11) && (t2 >= t11)) || ( (t1 > t2) && ((t1 <= t11) || (t2 >= t11))))
				AddToList(Trains, p);
			p = p->next;
		}

		return Trains;
	} 

	TrainInfoList* FilterDep(UINT Time1, UINT Time2)
	{
		TrainInfoList *p = Schedule;
		UINT t22, t1 = Time1, t2 = Time2; 
		TrainInfoList *Trains = NULL;
		
		while (p != NULL)
		{
			t22 = p->TimeDep;
			if (((t1 <= t2) && (t1 <= t22) && (t2 >= t22)) || ((t1 > t2) && ((t1 <= t22) || (t2 >= t22))))
				AddToList(Trains, p);
			p = p->next;
		}

		return Trains;
	}      

private:
	TrainInfoList *Schedule;
	
	char* strdup(char *s)
	{
		char *p = new char[strlen(s)+1];
		if (p != NULL) strcpy(p, s);
		return p;
	}
	
	bool AddToList(TrainInfoList *list, TrainInfoList *elem)
	{
		TrainInfoList *p = new TrainInfoList;
		p->Way = elem->Way;
		p->TrainNum = elem->TrainNum;
		p->TimeArr = elem->TimeArr;
		p->TimeDep = elem->TimeDep;
		p->StationSour = strdup(elem->StationSour);
		p->StationDest = strdup(elem->StationDest);
		
		/*if (list == NULL)
		{			
			list = p;
			list->next = NULL;
		}
		else
		{*/
			p->next = list;
			list = p;
		//}

		return true;	
	}

	bool AddToList(TrainInfoList *list, TrainInfo elem)
	{
		TrainInfoList *p = new TrainInfoList;
		p->Way = elem.Way;
		p->TrainNum = elem.TrainNum;
		p->TimeArr = elem.TimeArr;
		p->TimeDep = elem.TimeDep;
		p->StationSour = strdup(elem.StationSour);
		p->StationDest = strdup(elem.StationDest);
		
		p->next = list;
		list = p;

		return true;	
	}

	bool DelFromList(TrainInfoList *list, TrainInfoList *pelem)
	{
		if (list == pelem)
		{
			list = pelem->next;
			delete pelem;
		}
		else
		{
			TrainInfoList *p = list;
			while (p->next != pelem)
				p = p->next;
			p->next = pelem->next;
			delete pelem;
		}
	}

	bool HasTrain(UINT TrainNum)
	{
		TrainInfoList *p = Schedule;

		while (p != NULL)
		{
			if (p->TrainNum == TrainNum)
				return true;
			p = p->next;
		}

		return false;
	}

	bool WayEmpty(BYTE Way, UINT TimeArr, UINT TimeDep)
	{
		UINT t11, t22, t1 = TimeArr, t2 = TimeDep;  
		TrainInfoList *p = Schedule;

		while (p != NULL)
		{
			if (p->Way == Way)
			{
				t11 = p->TimeArr;
				t22 = p->TimeDep;
				if (!( ((t22 >= t11) && (t2 >= t1) && ((t2 < t11) || (t1 > t22)))
						|| ((t22 < t11) && (t2 > t1) && (t2 < t11) && (t1 > t22))
						|| ((t22 >= t11) && (t2 < t1) && (t2 < t11) && (t1 > t22)) 
					))
					return false;
			}
			p = p->next;
		}

		return true;
	}
};

void main()
{
}