数据结构课程设计---航班售票处服务系统

全是自己手搓的,没有加错误提示,有问题请大家指正。

#include<iostream>
#include<string>
using namespace std;
int flag;
//此链表存储已订票的客户名单
typedef struct already
{
	char name[10];
	struct already *next;
}already,*touzhizhen;

//此链表存储预约登记的客户名单
typedef struct wait
{
	char name[10];
	struct wait *next;
}wait,*touzhizhen1;

typedef struct {
	char start[20];           //起始站点
	char end[20];             //终点站点
	int flight;               //航班号
    int date;                //飞行日期
	int limit;                //乘员定额
	int margin;               //余额量
    already * user1;          //指向已经订票客户链表的头指针
    wait * user2;             //指向预约登记链表的头指针
}Airport;
//顺序表定义
typedef struct List{
	Airport *Base;//存储顺序表基地址
    int MAX;//存储顺序表最长字节
	int length;//当前顺序表长度
	int move;//顺序表可操作字节
}list;
//初始化顺序表,返回值为基地址
Airport * List_init(list & t)
{ 
	Airport * Base;
	Base= new Airport[t.MAX];//创建十个
    t.length=0;//此时还是空表
    for(int i=0;i<10;i++)
	{
	   Base[i].flight=0;//用来表示是否被插入数据
	}
	return Base;
}
//初始化一个链表头结点
already* lianbiao_init(void)
{
	already *L; // 链表头指针
	L=(touzhizhen)malloc(sizeof(already));
	L->next=NULL;
	L->name[0]='\0';
	return L;
}
//初始化一个链表头结点
wait* lianbiao_init1(void)
{
	wait * L; // 链表头指针
	L=(touzhizhen1)malloc(sizeof(wait));
	L->next=NULL;
	L->name[0]='\0';
	return L;
}
void output(Airport * base)
{
	cout<<"航班起始站点:"<<base->start<<endl;
	cout<<"航班终点站点:"<<base->end<<endl;
	cout<<"航班起飞日期:"<<base->date<<endl;
	cout<<"航班号:"<<base->flight<<endl;
	cout<<"当前余票:"<<base->margin<<endl;
}

already * insert(already * x1,char name1[15])
{
   //此时我们要将name1插入链表(以首字母排序)
	already * p=x1;//p指向首地址
    already * p1=x1;
	if(p->name[0]=='\0')//解决第一次插入的问题
	{
     strcpy(p->name,name1);//把name1赋值给name域
	}
	else//第一个元素已经被插入
	{
	already * s=(touzhizhen)malloc(sizeof(already));//此时s指向待插入的结点
	strcpy(s->name,name1);//把name1赋值给name域
	s->next=NULL;
	//p1->next!=NULL和strcmp(p1->next->name,s->name)<0的先后顺序(空指针)
    while(strcmp(p1->name,s->name)<0 && p1->next!=NULL && strcmp(p1->next->name,s->name)<0 )//p1指针向后移动的条件 s比p1和p1后的元素都要大
	{
		//此时p1要向后移动
		p1=p1->next;
	}  
    if(p1->next==NULL && strcmp(p1->name,s->name)<0)//字符串比任何一个都大
	{
		p1->next=s;
		s->next=NULL;
	}
	else if(strcmp(p1->name,s->name)>0)//第一个都比s指向的结点大直接头插法
	{
       s->next=p1;
	   x1=s;
	}
    //
	//上述已经解决完两个极端情况,接下来普通情况,此时p1指向待插入的前一个
	/
	else if(strcmp(p1->name,s->name)<0 && p1->next!=NULL && strcmp(p1->next->name,s->name)>0)
	{
		s->next=p1->next;
		p1->next=s;
	}
	}
	return x1;
}
already * search(already * x1,char name1[15])
{
	already * p=x1;
	already * p1=x1;
	if(strcmp(x1->name,name1)==0)//当所要寻找的是第一个
	{
		p=p->next;
		cout<<"我们已找到你的名字且删除"<<endl;
		flag=1;
		return p;
	}
	while(p!=NULL)
	{
		if(strcmp(p->name,name1)==0)
		{
			//找到元素
			p1->next=p1->next->next;
			cout<<"我们已找到你的名字且删除"<<endl;
			flag=1;
			return x1;
		}
       p1=p;//p用来存储p1的上一个
	   p=p->next;
	}
	if(p==NULL)
	{
		cout<<"我们未能找到你的名字,请您再次确认"<<endl;
		flag=0;
	}
}
wait * search1(wait * x1,char name1[15])
{
  wait * p=x1;
  wait * p1=x1;
  	if(strcmp(x1->name,name1)==0)//当所要寻找的是第一个
	{
		p=p->next;
		cout<<"我们已找到你的名字且删除"<<endl;
		flag=1;
		return p;
	}
    while(p!=NULL)
	{
        if(strcmp(p->name,name1)==0)
		{
			//找到元素
			p1->next=p1->next->next;
			cout<<"我们已找到你的名字且删除"<<endl;
			flag=1;
			return x1;
		}
		p1=p;
		p=p->next;
	}
    if(p==NULL)
	{
		cout<<"我们未能找到你的名字,请您再次确认"<<endl;
		flag=0;
	}
}
wait * insert1(wait * x1,char name3[15])
{
  //必须使用尾插法
	wait * p=x1;
	wait * p1=x1;//定义一个尾指针
	wait * s;
	while(p1->next!=NULL)
	p1=p1->next;
	if(p->name[0]=='\0')
	{
		strcpy(p->name,name3);
	}
	else 
	{
       s=(touzhizhen1)malloc(sizeof(wait));
	   strcpy(s->name,name3);
	   p1->next=s;
	   s->next=NULL;
	}
	return x1;
}
//打印链表
void printv(already * x1)
{
	while(x1!=NULL)
	{
	  cout<<x1->name<<endl;
	  x1=x1->next;
	}
}
void printv1(wait * x1)
{
	while(x1!=NULL)
	{
	  cout<<x1->name<<endl;
	  x1=x1->next;
	}
}
int main()
{
	char inpu[10];
	char com[10]="YES";
	char com1[10]="NO";
	char name4[15];
	char name5[15];
	int date2;
	int date4;
	int flight4;
	int flight5;
    int date5;
	int num1;
	int num4;
	char name1[15];
    char name[15];
	char name3[15];
	char name7[15];
	int num;
	int flight1;
	int flight2;
	int date1;
	char arr[10];
	char a[10]="end";
	char b[10]="continue";
	char pos[10];
	char pos1[10];
	int mode;
	int mode1;
	int mode2;
	int mode3;
	wait * wait1;
	char end1[15];
	Airport * base1;
	//声明一个线性表
	list t;
	t.MAX=10;
	t.move=10;
	//t.Base指向线性表
	t.Base=List_init(t);
    Airport * base=t.Base;
	while(1)
	{
       cout<<"您是工作人员还是乘客(输入0为工作人员,输入1为乘客):";
	   cin>>mode;
	   if(mode==0)//工作人员
	   {
		   cout<<"请输入您要进行的操作(输入0增加航班信息,输入1查看航班乘客信息):";
           cin>>mode1;
		   if(mode1==0)
		   {
			while(strcmp(arr,a)!=0)
			{
				while(base->flight!=0)
				{
					base++;//指针后移
				}
				//此时base已经移动到待插入位置
				cout<<"起始站点:";//不要加空格
				cin>>base->start;
				cout<<"终点站名:";
				cin>>base->end;
				//
				getchar();
				//
				cout<<"航班号:";
				cin>>base->flight;
				cout<<"飞机日期:";
				cin>>base->date;
				cout<<"乘员定额:";
				cin>>base->limit;
				base->margin=base->limit;//初始化余额和定额一样
                //接下来创建两个链表
                base->user1=lianbiao_init();
				base->user2=lianbiao_init1();
				cout<<"请输入下一步操作(continue or end)"<<endl;
                scanf("%s", arr); //输入字符串,可以加&也可以不加&
				while(strcmp(arr,a)!=0 && strcmp(arr,b)!=0)
				{
					cout<<"输入违法请重新输入"<<endl;
                    scanf("%s", arr);
				}
			}
            arr[0]='\0';
		   }
		   if(mode1==1)
		   {
			   cout<<"请输入所要查询航班的日期"<<endl;
			   cin>>date2;
               cout<<"请输入所要查询航班的航班号"<<endl;
			   cin>>flight2;
			 //以下开始检索
             base=t.Base;//重新指向基地址
			while(base->flight!=0)
			{
                if(date2==base->date&&flight2==base->flight)
				break;
				base++;//指针后移
			}
			if(base->flight==0)
			{cout<<"未找到该航班"<<endl;}
			else
		{
			//此时base指向工作人员所需要的航班信息
			cout<<"下面已订票的乘客名单"<<endl;
            printv(base->user1);
			cout<<"下面是预约登记的乘客名单"<<endl;
			printv1(base->user2);
		}
		   }
		   if(mode1!=0 && mode1!=1)
			   cout<<"输入违法"<<endl;
	   }

       if(mode==1)//乘客
       {
         cout<<"尊敬的客户,您好!请输入您要进行的操作(输入0为查询航线,输入1为订票,输入2为退票,输入3为退出预约序列)";
		 cin>>mode2;
		 if(mode2==0)
		 {
			 cout<<"请输入您的起始站点:";
			 scanf("%s", pos); //输入字符串,可以加&也可以不加&
			 cout<<"请输入您的抵达站点:";
			 scanf("%s", pos1); //输入字符串,可以加&也可以不加&
			 //以下开始检索
             base=t.Base;//重新指向基地址
			while(base->flight!=0)
			{
                if(strcmp(base->start,pos)==0 && strcmp(base->end,pos1)==0)//起始站点和用户输入一样
				output(base);
				base++;//指针后移
			}
		 }
		 if(mode2==1)
		 {
			 cout<<"请您输入日期:";
             cin>>date1;//用户出发日期
			 cout<<"请您输入航班号:";
			 cin>>flight1;
			 cout<<"请您输入订票数额:";
			 cin>>num;
			 //以下开始检索
             base=t.Base;//重新指向基地址
			while(base->flight!=0)
			{
                if(date1==base->date&&flight1==base->flight)
				break;
				base++;//指针后移
			}
			//此时base指向用户所需要的航班信息
			//以下代码判断是否还有余额
			int left;
			left=base->margin-num;
			if(left>=0)//此时还有余额
			{
			cout<<"请依次输入购票名:";
			for(int k=0;k<num;k++)
			{
               scanf("%s", name1);
			   //将名字加入链表
			   base->user1=insert(base->user1,name1);
			}
			cout<<"您的座位号依次为:"<<endl;
               for(int j=0;j<num;j++)
			   {
				   cout<<base->limit-base->margin+j;
			   }
			   cout<<endl;
			   base->margin-=num;
			   cout<<"当前余额"<<base->margin<<endl;
			}
			else//此时没有余额
			{
				cout<<"当前余票不能满足您的要求,请您选择下一步操作(输入0:继续购票进入预约队列,输入1:不订票,输入3:为您推荐其他航线)";
                cin>>mode3;
                base1=base;
				if(mode3==0)//继续购票进入预约队列
				{
                      cout<<"请输入您的名字以便当有空位时我们能及时通知您"<<endl;
					  scanf("%s", name3);
                      base->user2=insert1(base->user2,name3);
				}
				if(mode3==3)
				{
					cout<<"请输入您的目的地:"<<endl;
					scanf("%s",end1);
			while(base->flight!=0)
			{
                if(strcmp(base->end,end1)==0 && base!=base1)
				{
					output(base);
				}
				base++;//指针后移
			}
				}
			}
		 }
         if(mode2==2)
		 {
			 cout<<"请输入您的姓名:";
			 cin>>name4;
			 //接下来是退票操作
			 cout<<"请您输入日期:";
             cin>>date4;//用户出发日期
			 cout<<"请您输入航班号:";
			 cin>>flight4;
			 cout<<"请您输入退票数额:";
			 cin>>num1;
			 //以下开始检索
             base=t.Base;//重新指向基地址
			while(base->flight!=0)
			{
                if(date4==base->date&&flight4==base->flight)
				break;
				base++;//指针后移
			}
			//此时base指向用户所需要的航班信息
			//在user1链表找到name4
			base->user1=search(base->user1,name4);
			wait1=base->user2;
			while(wait1!=NULL && wait1->name[0]!='\0' && flag==1)
			{
			    base->margin+=num1;//更新余额
				cout<<"请"<<wait1->name<<"注意"<<"当前余票还有"<<base->margin<<"你是否还要购票(输入YES或NO)"<<endl;
				scanf("%s",inpu);
				if(strcmp(com,inpu)==0)//yes
				{
			      cout<<"请您输入订票数额:";
			      cin>>num4;
			       cout<<"请依次输入购票名:";
			       for(int k=0;k<num4;k++)
				   {
                      scanf("%s", name7);
			         //将名字加入链表
			          base->user1=insert(base->user1,name7);
				   }
                base->user2=search1(base->user2,wait1->name);
				   break;
				}
				else if(strcmp(com1,inpu)==0)//no
				{
					wait1=wait1->next;
				}
			}
			flag=0;
		 }
		 if(mode2==3)//退出预约序列
		 {
             cout<<"请输入您的姓名:";
			 scanf("%s", name5); 
			 //接下来是退票操作
			 cout<<"请您输入日期:";
             cin>>date5;//用户出发日期
			 cout<<"请您输入航班号:";
			 cin>>flight5;
			 //以下开始检索
             base=t.Base;//重新指向基地址
			while(base->flight!=0)
			{
                if(date5==base->date&&flight5==base->flight)
				break;
				base++;//指针后移
			}
         base->user2=search1(base->user2,name5);
		 }
		   if( mode2!=0 && mode2!=1 && mode2!=2 && mode2!=3)
		   cout<<"输入违法请重新输入"<<endl;
	   }
	}
}
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,下面是一个简单的火车票管理系统的C语言代码设计,仅供参考: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TRAIN_NUM 100 // 最大火车数目 #define MAX_TICKET_NUM 1000 // 最大票数目 // 火车信息结构体 struct Train { char train_id[10]; // 火车编号 char start_station[20]; // 起始站 char end_station[20]; // 终点站 char departure_time[10]; // 出发时间 int ticket_num; // 票数 }; // 票信息结构体 struct Ticket { char train_id[10]; // 火车编号 char start_station[20]; // 起始站 char end_station[20]; // 终点站 char departure_time[10]; // 出发时间 int seat_num; // 座位号 }; // 火车信息数组 struct Train train_list[MAX_TRAIN_NUM]; // 票信息数组 struct Ticket ticket_list[MAX_TICKET_NUM]; // 火车数目和票数目 int train_num = 0, ticket_num = 0; // 添加火车信息 void add_train() { // 输入火车信息 printf("请输入火车编号:"); scanf("%s", train_list[train_num].train_id); printf("请输入起始站:"); scanf("%s", train_list[train_num].start_station); printf("请输入终点站:"); scanf("%s", train_list[train_num].end_station); printf("请输入出发时间:"); scanf("%s", train_list[train_num].departure_time); printf("请输入票数:"); scanf("%d", &train_list[train_num].ticket_num); // 火车数目加1 train_num++; printf("火车信息添加成功!\n"); } // 查询火车信息 void query_train() { // 输入火车编号 char train_id[10]; printf("请输入火车编号:"); scanf("%s", train_id); // 查找火车信息 int i, flag = 0; for (i = 0; i < train_num; i++) { if (strcmp(train_list[i].train_id, train_id) == 0) { printf("火车编号:%s\n", train_list[i].train_id); printf("起始站:%s\n", train_list[i].start_station); printf("终点站:%s\n", train_list[i].end_station); printf("出发时间:%s\n", train_list[i].departure_time); printf("票数:%d\n", train_list[i].ticket_num); flag = 1; break; } } if (flag == 0) { printf("没有找到该火车信息!\n"); } } // 添加票信息 void add_ticket() { // 输入票信息 printf("请输入火车编号:"); scanf("%s", ticket_list[ticket_num].train_id); printf("请输入起始站:"); scanf("%s", ticket_list[ticket_num].start_station); printf("请输入终点站:"); scanf("%s", ticket_list[ticket_num].end_station); printf("请输入出发时间:"); scanf("%s", ticket_list[ticket_num].departure_time); printf("请输入座位号:"); scanf("%d", &ticket_list[ticket_num].seat_num); // 票数目加1 ticket_num++; printf("票信息添加成功!\n"); } // 查询票信息 void query_ticket() { // 输入火车编号 char train_id[10]; printf("请输入火车编号:"); scanf("%s", train_id); // 查找票信息 int i, flag = 0; for (i = 0; i < ticket_num; i++) { if (strcmp(ticket_list[i].train_id, train_id) == 0) { printf("火车编号:%s\n", ticket_list[i].train_id); printf("起始站:%s\n", ticket_list[i].start_station); printf("终点站:%s\n", ticket_list[i].end_station); printf("出发时间:%s\n", ticket_list[i].departure_time); printf("座位号:%d\n", ticket_list[i].seat_num); flag = 1; } } if (flag == 0) { printf("没有找到该火车的票信息!\n"); } } // 主函数 int main() { int choice; while (1) { // 显示菜单 printf("1. 添加火车信息\n"); printf("2. 查询火车信息\n"); printf("3. 添加票信息\n"); printf("4. 查询票信息\n"); printf("5. 退出\n"); printf("请输入您的选择:"); scanf("%d", &choice); // 根据选择执行相应操作 switch (choice) { case 1: add_train(); break; case 2: query_train(); break; case 3: add_ticket(); break; case 4: query_ticket(); break; case 5: printf("谢谢使用!\n"); exit(0); default: printf("输入有误,请重新输入!\n"); } } return 0; } ``` 这个代码实现了简单的火车票管理系统,包括添加火车信息、查询火车信息、添加票信息、查询票信息等功能。需要注意的是,这只是一个示例代码,实际的火车票管理系统需要根据具体需求进行设计和开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是唐不是傻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值