【数据结构】小项目:航班查询系统

项目要求

  1.已经给出链表定义(本系统用双链表实现更为方便,但是由于要求用单链表,所以按照规定做事)

  2.信息录入(当然是添加航班与取消航班了)

  3.按照起飞时间先后顺序排列(可以在插入时即顺序插入,但为了体现排序过程,封装成了排序函数)

  4.可根据不同关键字进行查询(实现了三种具有代表性的查询方案:航班号查询(结果唯一),起点站查询(结果不唯一),路线查询(最常用))

 


 

实现

头文件

 1 //@ author 成鹏致远
 2 //@ net http://infodown.tap.cn
 3 //@ qq 552158509
 4 //@ blog lcw.cnblogs.com
 5 
 6 #ifndef __FLIGHT_H
 7 #define __FLIGHT_H
 8 
 9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <stdbool.h>
12 #include <string.h>
13 
14 typedef struct flight
15 {
16     char number[10];//航班号
17     char staddress[20];//起站点
18     char arraddress[20];//终点站
19     char date[10];//班期
20     char type[4];//机型
21     int stime;//起飞时间
22     int atime;//到达时间
23     int value;//标价
24 }datatype;
25 
26 typedef struct node
27 {
28     datatype info;
29     struct node *next;
30 }node_list,*p_node_list;
31 
32 
33 extern void flight_manage(p_node_list phead);//航班管理
34 extern void flight_add(p_node_list phead);//添加航班
35 extern p_node_list in_number(p_node_list phead, char *);//通过航班号查询航班,有则返回指向航班的前一个节点的指针(删除节点时方便操作)
36 extern void flight_cancel(p_node_list phead);//取消航班
37 extern void flight_show(p_node_list phead);//显示航班信息
38 extern void flight_search(p_node_list phead);//查询航班信息
39 
40 extern void list_init(p_node_list *phead);//链表头初始化
41 extern void keep_scren();//保持界面
42 extern void flight_sort(p_node_list phead);//按起飞时间排序
43 
44 extern void flight_print(p_node_list pnode);//打印pnode指向的结点的航班信息
45 
46 
47 
48 
49 extern void flight_search(p_node_list phead);//查询航班信息
50 extern void search_by_number(p_node_list phead, char *num);//航班号查询
51 extern void search_by_saddr(p_node_list phead, char *saddr);//起点站查询
52 extern void search_by_line(p_node_list phead, char *saddr, char *daddr);//航线查询
53 
54 
55 
56 #endif
View Code

 主文件

 1 //@ author 成鹏致远
 2 //@ net http://infodown.tap.cn
 3 //@ qq 552158509
 4 //@ blog lcw.cnblogs.com
 5 
 6 //功能: 1.信息录入
 7 //     2.信息显示(按照起飞时间先后顺序显示)
 8 //     3.信息查询(可根据不同的关键字进行查询)
 9 
10 #include "flight.h"
11 
12 int main()
13 {
14     p_node_list phead;
15     int num;//功能选择
16     int ret;//存储scanf返回值
17 
18     list_init(&phead);//初始化
19 
20     do
21     {
22         system("clear");
23         printf("\tFlight Searching System\n");
24         printf("******************************* \n");
25         printf("1.Manage Flight \n");
26         printf("2.Printf Flight Information \n");
27         printf("3.Search Flight Information \n");
28         printf("4.Exit \n");
29         printf("******************************* \n");
30         printf("Pls select:");
31 
32         ret = scanf("%d",&num);
33         while('\n' != getchar());//清空输入缓冲区
34         
35         if(1 != ret)//输入字符
36         {
37             printf("******************************* \n");
38             printf("\tPls input your select !\n");
39             printf("******************************* \n");
40             sleep(2);
41         }
42 
43 
44         switch(num)
45         {
46             case 1://航班管理
47                 flight_manage(phead);
48                 break;
49             case 2://显示航班信息
50                 flight_show(phead);
51                 break;
52             case 3://查询航班信息
53                 flight_search(phead);
54                 break;
55             case 4://退出系统
56                 exit(0);
57             default:
58                 break;
59         }
60     }
61     while(4 != num);
62 
63     return 0;
64 }
View Code

航班管理文件

  1 //@ author 成鹏致远
  2 //@ net http://infodown.tap.cn
  3 //@ qq 552158509
  4 //@ blog lcw.cnblogs.com
  5 
  6 #include "flight.h"
  7 
  8 void flight_manage(p_node_list phead)//航班管理
  9 {
 10     int num;
 11     int ret;//存储scanf返回值
 12 
 13     do
 14     {
 15         system("clear");
 16         printf("\tFlight Management\n");
 17         printf("******************************* \n");
 18         printf("1.Add flight \n");
 19         printf("2.Cancel flight \n");
 20         printf("3.Print flight information \n");
 21         printf("4.Exit \n");
 22         printf("******************************* \n");
 23         printf("Pls select:");
 24 
 25         ret = scanf("%d",&num);
 26         while('\n' != getchar());//清空缓冲区
 27 
 28         if(1 != ret)//输入字符
 29         {
 30             printf("******************************* \n");
 31             printf("\tPls input your select !\n");
 32             printf("******************************* \n");
 33             sleep(2);
 34         }
 35         switch(num)
 36         {
 37             case 1://添加航班
 38                 flight_add(phead);
 39                 break;
 40             case 2://取消航班
 41                 flight_cancel(phead);
 42                 break;
 43             case 3://航班信息
 44                 flight_show(phead);
 45                 break;
 46             case 4:
 47                 return;
 48             default:
 49                 break;
 50         }
 51     }
 52     while(4 != num);
 53 }
 54 
 55 void flight_add(p_node_list phead)//添加航班
 56 {
 57     p_node_list pnode;
 58 
 59     pnode = (p_node_list)malloc(sizeof(node_list));
 60     if(NULL == pnode)
 61     {
 62         perror("flight_add(malloc)");
 63         exit(1);
 64     }
 65     
 66     //输入航班信息
 67     system("clear");
 68     printf("\tPls input flight information:\n");
 69     printf("******************************* \n");
 70     printf("1.Flight number      :");
 71         while(1)//航班号为主键,不能重复
 72         {
 73             gets(pnode->info.number);
 74             if(NULL != in_number(phead,pnode->info.number))
 75                 printf("Flight number exist,Pls input again:");
 76             else
 77                 break;
 78         }
 79     printf("2.Start address      :");
 80         gets(pnode->info.staddress);
 81     printf("3.Destination address:");
 82         gets(pnode->info.arraddress);
 83     printf("4.Flight date        :");
 84         gets(pnode->info.date);
 85     printf("5.Flight type        :");
 86         gets(pnode->info.type);
 87     printf("6.Flight start time  :");//需要对输入时间进行格式化处理和判断,这里略过
 88         scanf("%d",&pnode->info.stime);
 89     printf("7.Flight arrive time :");
 90         scanf("%d",&pnode->info.atime);
 91     printf("8.Ticket price       :");
 92         scanf("%d",&pnode->info.value);
 93         
 94     pnode->next = phead->next;
 95     phead->next = pnode;
 96     printf("*******************************");
 97     printf("\n\tAdd success!\n");
 98     printf("*******************************");
 99     keep_scren();//保持界面
100 
101 }
102 
103 p_node_list in_number(p_node_list phead, char *number)//通过航班号查询是否已有此航班,如果有,则返回指向航班的前一个节点的指针(删除节点时方便操作)
104 {
105     p_node_list pnode  = phead;//遍历节点
106     
107     while(NULL != pnode->next)
108     {
109         if(0 == strcmp(number,pnode->next->info.number))
110         {
111             return pnode;
112         }
113         pnode = pnode->next;
114     }
115 
116     return NULL;
117 }
118 
119 void flight_cancel(p_node_list phead)//取消航班
120 {
121     char num[10];
122     p_node_list pnode;//存储删除节点前一节点地址
123     p_node_list tmp;//临时指向删除节点地址
124 
125     printf("Pls input the number to be cancel:");
126     gets(num);
127     pnode = in_number(phead,num);
128 
129 
130     if(NULL == pnode)//不存在此航班
131     {
132         printf("\tNo this flight,Pls check!");
133         keep_scren();//保持界面
134     }
135     else//删除航班
136     {
137         tmp = pnode->next;//删除该节点
138         pnode->next = tmp->next;//这里可以利用in_number()的返回值进行删除节点,pnode为另一变量,故只能对pnode->next赋值才能改变原链表
139         free(tmp);
140         printf("\tCancel success,Pls check!");
141         keep_scren();//保持界面
142     }
143     
144 }
145 
146 void flight_show(p_node_list phead)//显示航班信息
147 {
148     printf("*******************************\n");
149     printf("\tFlight Information\n");
150     printf("*******************************\n");
151     p_node_list pnode = phead->next;
152 
153     if(NULL == pnode)
154     {
155         printf("\tNo flight,Pls check!\n");
156         printf("*******************************\n");
157     }
158     
159     while(NULL != pnode)
160     {
161         flight_sort(phead);//先按起飞时间进行排序
162         flight_print(pnode);//打印航班信息
163         pnode = pnode->next;
164     }
165     keep_scren();//保持界面
166 }
167 
168 
169 
170 void list_init(p_node_list *phead)//链表头初始化
171 {
172     *phead = (p_node_list)malloc(sizeof(node_list));
173     if(NULL == *phead)
174     {
175         perror("List_init(malloc)");
176         exit(1);
177     }
178     (*phead)->next = NULL;//初始化为空
179 }
180 
181 void keep_scren()//保持界面
182 {
183     char answer;
184 
185     printf("\n*******************************\n");
186     printf("\treturn ?(y/Y) \n");
187     while(1)
188     {
189         scanf("%c",&answer);
190         if('y' == answer || 'Y' == answer)
191             return;
192     }
193 }
194 
195 
196 void flight_sort(p_node_list phead)//按起飞时间排序
197 {
198     p_node_list pnode = phead->next;
199     p_node_list tmp;
200     datatype data;//用来临时存放元素数据
201     
202     while(NULL != pnode)
203     {
204         tmp = pnode->next;
205 
206         while(NULL != tmp)
207         {
208             if(pnode->info.stime > tmp->info.stime)//交换值域
209             {
210                 data = tmp->info;
211                 tmp->info = pnode->info;
212                 pnode->info = data;
213             }
214             tmp = tmp->next;
215         }
216         pnode = pnode->next;
217     }
218 
219 }
220 
221 void flight_print(p_node_list pnode)//打印pnode指向的结点的航班信息
222 {
223     printf("Flight number      :%s\t<------Key value \nStart address      :%s \nDestination address:%s \nFlight date        :%s \nFlight type        :%s \nStart time         :%d \nArrive time        :%d \nTicket price       :%d \n",pnode->info.number,pnode->info.staddress,pnode->info.arraddress,pnode->info.date,pnode->info.type,pnode->info.stime,pnode->info.atime,pnode->info.value);
224     printf("*******************************\n");
225 }
View Code

 航班查询文件

  1 //@ author 成鹏致远
  2 //@ net http://infodown.tap.cn
  3 //@ qq 552158509
  4 //@ blog lcw.cnblogs.com
  5 
  6 #include "flight.h"
  7 
  8 
  9 void flight_search(p_node_list phead)//查询航班信息
 10 {
 11     int num;
 12     int ret;//存储scanf返回值
 13     char number[10],saddr[20],daddr[20];//航班号,起点站,终点站
 14 
 15     do
 16     {
 17         system("clear");
 18         printf("\tSearch Flight!\n");
 19         printf("******************************* \n");
 20         printf("1.Search by number \n");
 21         printf("2.Search by start address \n");
 22         printf("3.Search by flight line \n");
 23         printf("4.Exit \n");
 24         printf("******************************* \n");
 25         printf("Pls select:");
 26 
 27         ret = scanf("%d",&num);
 28         while('\n' != getchar());//清空缓冲区
 29 
 30         if(1 != ret)//输入字符
 31         {
 32             printf("******************************* \n");
 33             printf("\tPls input your select\n");
 34             printf("******************************* \n");
 35             sleep(2);
 36         }
 37         switch(num)
 38         {
 39             case 1://航班号查询
 40                 {
 41                     printf("Pls input the number:");
 42                     gets(number);
 43                     search_by_number(phead,number);
 44                     break;
 45                 }
 46             case 2://起点站查询
 47                 {
 48                     printf("Pls input the start address:");
 49                     gets(saddr);
 50                     search_by_saddr(phead,saddr);
 51                     break;
 52                 }
 53             case 3://路线查询
 54                 {
 55                     printf("Pls input the start address:");
 56                     gets(saddr);
 57                     printf("Pls input the destination address:");
 58                     gets(daddr);
 59                     search_by_line(phead,saddr,daddr);
 60                     break;
 61                 }
 62             case 4:
 63                 return;
 64             default:
 65                 break;
 66         }
 67     }
 68     while(4 != num);
 69 }
 70 
 71 
 72 void search_by_number(p_node_list phead, char *num)//航班号查询
 73 {
 74     p_node_list pnode = in_number(phead, num);//返回指定节点的下一个节点
 75     if(NULL == pnode)
 76     {
 77         printf("No Flight!\n");
 78         keep_scren();
 79     }
 80     else//打印航班信息
 81     {
 82         pnode = pnode->next;
 83         flight_print(pnode);
 84         keep_scren();
 85     }
 86 }
 87 
 88 
 89 void search_by_saddr(p_node_list phead, char *saddr)//起点站查询
 90 {
 91     p_node_list pnode = phead->next;
 92 
 93     if(NULL == pnode)//无航班
 94     {
 95         printf("No Flight!\n");
 96         keep_scren();
 97     }
 98     else//遍历查找
 99     {
100         while(NULL != pnode)
101         {
102             if(0 == strcmp(saddr,pnode->info.staddress))//找到
103             {
104                 flight_print(pnode);//打印航班信息
105                 keep_scren();
106                 break;
107             }
108             pnode = pnode->next;
109         }
110     }
111 }
112 void search_by_line(p_node_list phead, char *saddr, char *daddr)//航线查询
113 {
114     p_node_list pnode = phead->next;
115 
116     if(NULL == pnode)//无航班
117     {
118         printf("No Flight!\n");
119         keep_scren();
120     }
121     else//遍历查找
122     {
123         while(NULL != pnode)
124         {
125             if(0 == strcmp(saddr,pnode->info.staddress) && 0 == strcmp(daddr,pnode->info.arraddress))//找到
126             {
127                 flight_print(pnode);//打印航班信息
128                 keep_scren();
129                 break;
130             }
131             pnode = pnode->next;
132         }
133     }
134 }
View Code

 Makefile文件

1 flight:flight_manage.c main.c flight_search.c
2         gcc -o $@ $^
3 
4 clean:
5         $(RM) flight .*.sw?
View Code

 

1.问题描述 该设计要求对飞机航班信息进行排序和查找。可按航班的航班号、起点站、终点站、起飞时间以及到达时间等信息进行查询。 2.扩展功能: ①能够在起点站终点站相同的航班信息中筛选出票价最低及飞行时间最短的航班,并显示; ②能够不断添加新的航班信息; ③能够检验输入时间的合法性。 3.任务要求 对于本设计,可采用基数排序法对一组具有结构特点的飞机航班号进行排序,利用二分查找法对排好序的航班记录按航班号实现快速查找,按其他次关键字的查找可采用最简单的顺序查找方法进行,因此他们用得较少。 每个航班记录包括八项,分别是:航班号、起点站、终点站、班期、起飞时间、到达时间、飞机型号以及票价等,假设航班信息表(8条记录) 航班号 起点站 终点站 班期 起飞时间 到达时间 机型 票价 CA1544 合肥 北京 1.2.4.5 1055 1240 733 960 MU5341 上海 广州 每日 1420 1615 M90 1280 CZ3869 重庆 深圳 2.4.6 0855 1035 733 1010 MU3682 桂林 南京 2.3.4.6.7 2050 2215 M90 1380 HU1836 上海 北京 每日 0940 1120 738 1250 CZ3528 成都 厦门 1.3.4.5.7 1510 1650 CRJ 1060 MU4594 昆明 西安 1.3.5.6 1015 1140 328 1160 SC7425 青岛 海口 1.3.6 1920 2120 DH4 1630 其中航班号一项的格式为: K0 K1 K2 K3 K4 K5 C Z 3 8 6 9 其中K0和K1的输入值是航空公司的别称,用两个大写字母标示,后4位为航班号,这种航班号关键字可分成两段,即字母和数字。其余七项输入内容因为不涉及本设计的核心,因此除了票价为数值型外,均定义为字符串即可。
OOP(机试)[具体要求在压缩文档中给出] 项目名称: Air Infomation System 基于控制台的航班信息系统,简称AIS 具体要求如下: (1)显示航班信息系统主菜单,如图-1所示,包括: 1)列出所有航班 2)按起飞时间查询 3)按目的地查询 4)删除航班 5)更新航班 6)退出系统 (2)列出所有航班:查出所有航班的信息,以列表形式显示,包括:编号,航班号,目的地,起飞日期。 (3)按起飞时间查询:输入起飞时间(格式如2011-2-25),查出所有这一天的航班。 (4)按目的地查询:输入目的地,查出所有飞往此地的航班。 (5)删除航班:删除指定编号的航班。 (6)更新航班:更新指定编号的航班。 (7)退出系统。 三、类的设计 需要定义如下类 航班信息实体类(AirInfo) 航班编号(id) 航班号(flight_number) 目的地(destination) 起飞日期(flight_date) 航班信息管理类AirInfoManager类 程序入口类TestAirInfo类 四、具体要求及推荐实现步骤 6.创建实体类AirInfo,属性私有化,根据业务提供需要的构造方法和setter/getter方法。 7.创建航班管理AirInfoManager类,在类中提供列出所有航班的方法,按起飞时间查询 的方法、按目的地查询的方法、删除航班的方法、更新航班的方法、退出系统的方法。 8.创建TestAirInfo类,启动和运行系统。 9.航班的信息用ArrayList(或数组)保存。 10.要求代码规范,命名正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值