航班管理系统:
- 航班信息录入
- 显示所有航班信息
- 按照要求查询(根据日期、地点等),列出相关的航班信息
- 根据航班号删除航班信息
结构体定义:
// 航班信息结构体
typedef struct flight
{
char flight_number[16]; //航班号
char departure[32]; //出发地
char destination[32]; //目的地
char take_off_time[16]; //起飞时间
float price; //价格
struct flight *prev; //记录直接前驱的地址
struct flight *next; //记录直接后继的地址
}Flight_t,F_List;
//信息结构体,用于函数之间传递参数,减少参数数量
typedef struct flightInfo
{
char flight_number[16]; //航班号
char departure[32]; //出发地
char destination[32]; //目的地
char take_off_time[16]; //起飞时间
float price; //价格
}Info_t;
函数预定义:
//创建航班信息表(头结点)
Manager_t * Flight_Create(void);
//创建新的航班信息结点
Flight_t * Flight_NewInfo(Info_t info);
//判断双向链表是否为空
bool Flight_IsEmpty(F_List *manager);
// 将新的航班信息插入双向链表中(从链表尾部插入)
bool Flight_TailInsert(F_List *manager,Info_t info);
//删除指定航班号的航班信息
bool Flight_FlightNumberDel(F_List *manager,char *flight_number);
//查找并显示指定航班号的航班信息
bool Flight_FlightNumberFind(F_List *manager,char *flight_number);
//修改指定航班号的票价
bool Flight_PriceRevise(F_List *manager,char *flight_number,float newPrice);
//打印所有航班信息
bool Flight_print(F_List *manager);
//系统界面设置
void Flight_Interface(void);
各函数具体实现:
flight.c文件:
#include "flight.h"
//创建航班信息表(头结点)
F_List Flight_Create(void){
F_List list =(F_node *)calloc(1,sizeof(F_node));
list->prev = list->next = NULL;
return list;
}
//创建新的航班信息结点
F_node * Flight_NewInfo(Info_t info){
// 向堆内存申请空间
F_node* node = (F_node *)malloc(sizeof(F_node));
if(!node){
printf("节点申请内存失败!请重新尝试\n");
}
// 为节点赋值
strcpy(node->flight_number,info.flight_number);
strcpy(node->departure,info.departure);
strcpy(node->destination,info.destination);
strcpy(node->take_off_time,info.take_off_time);
node->price = info.price;
node->prev = node->next = NULL;
// 将节点返回
return node;
}
//判断双向链表是否为空
bool Flight_IsEmpty(F_List manager){
// 链表为空返回真
return (manager->next == NULL) ? true : false;
}
// 将新的航班信息插入双向链表中(从链表尾部插入)
bool Flight_TailInsert(F_List manager,Info_t info){
// 1.创建节点录入信息
F_node *node = Flight_NewInfo(info);
// 2.判断链表是否为空
if(Flight_IsEmpty(manager)){
// 链表为空
manager->next = node;
manager->prev = node;
node->prev = manager;
node->next = manager;
return true;
}
// 如果不为空
node->next = manager->prev;
manager->prev->next = node;
manager->prev = node;
node->next = manager;
return true;
}
//删除指定航班号的航班信息
bool Flight_FlightNumberDel(F_List manager,char *flight_number){
// 循环遍历整个链表,如果遇到相同则进行删除
F_node *q = manager;
F_node *p = manager->next; // 定义工作指针进行遍历
while(p != manager){
// strcmp函数:如果两字符串相等则返回0
if(!strcmp(p->flight_number,flight_number)){
// 找到了删除的元素
if(p->next == manager){
// 如果删除的元素是在最后一位
q->next = manager;
manager->next = q;
p->next = p->prev = NULL;
free(p);
return true;
}
// 不是最后一个元素
q->next = p->next;
q->next->prev = q;
p->next = p->prev = NULL;
return true;
}
q = p;
p = p->next;
}
return false;
}
//查找并显示指定航班号的航班信息
bool Flight_FlightNumberFind(F_List manager,char *flight_number){
F_node *p = manager->next;
while (p!=manager)
{ // 链表还没遍历完
if(!strcmp(p->flight_number,flight_number)){
// 成功找到航班信息
printf("航班号\t出发地\t目的地\t起飞时间\t价格\n");
printf("%s\t%s\t%s\t%s\t%f\n",
p->flight_number,p->departure,p->destination,p->take_off_time,p->price);
return true;
}
p = p->next;
}
if(p == manager){
printf("没有%s该航班信息。\n",flight_number);
}
return false;
}
//修改指定航班号的票价
bool Flight_PriceRevise(F_List manager,char *flight_number,float newPrice){
F_node *p = manager->next;
while (p!=manager)
{ // 链表还没遍历完
if(!strcmp(p->flight_number,flight_number)){
// 成功找到航班信息
p->price = newPrice;
return true;
}
p = p->next;
}
if(p == manager){
printf("没有%s该航班信息。",flight_number);
}
return false;
}
//打印所有航班信息
bool Flight_print(F_List manager){
F_node *p = manager->next;
printf("航班号\t出发地\t目的地\t起飞时间\t价格\n");
while (p!=manager)
{ // 链表还没遍历完
printf("%s\t%s\t%s\t%s\t\t%.2f\n",
p->flight_number,p->departure,p->destination,p->take_off_time,p->price);
p = p->next;
}
return false;
}
//系统界面设置
void Flight_Interface(void){
printf("===================航班信息查询系统===================\n");
printf("*******\t\t创建今日航班信息:1\t\t*******\n");
printf("*******\t\t 查询航班信息:2 \t\t*******\n");
printf("*******\t\t 删除航班信息:3 \t\t*******\n");
printf("*******\t\t 展示所有信息:4 \t\t*******\n");
printf("*******\t\t 修改航班票价:5 \t\t*******\n");
printf("*******\t\t 添加航班信息:6 \t\t*******\n");
printf("*******\t\t 退出系统:0 \t\t\t*******\n");
printf("======================================================\n");
}
flght.h文件
#define _FLIGHT_H
#ifdef _FLIGHT_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
// 航班信息结构体
typedef struct flight
{
char flight_number[16]; //航班号
char departure[32]; //出发地
char destination[32]; //目的地
char take_off_time[16]; //起飞时间
float price; //价格
struct flight *prev; //记录直接前驱的地址
struct flight *next; //记录直接后继的地址
}F_node,* F_List;
//信息结构体,用于函数之间传递参数,减少参数数量
typedef struct flightInfo
{
char flight_number[16]; //航班号
char departure[32]; //出发地
char destination[32]; //目的地
char take_off_time[16]; //起飞时间
float price; //价格
}Info_t;
//创建航班信息表(头结点)
F_List Flight_Create(void);
//创建新的航班信息结点
F_node *Flight_NewInfo(Info_t info);
//判断双向链表是否为空
bool Flight_IsEmpty(F_List manager);
// 将新的航班信息插入双向链表中(从链表尾部插入)
bool Flight_TailInsert(F_List manager,Info_t info);
//删除指定航班号的航班信息
bool Flight_FlightNumberDel(F_List manager,char *flight_number);
//查找并显示指定航班号的航班信息
bool Flight_FlightNumberFind(F_List manager,char *flight_number);
//修改指定航班号的票价
bool Flight_PriceRevise(F_List manager,char *flight_number,float newPrice);
//打印所有航班信息
bool Flight_print(F_List manager);
//系统界面设置
void Flight_Interface(void);
#endif
main.c文件:
#include "flight.h"
Info_t setInfo(){
Info_t info;
printf("请输入航班号:\n");
scanf("%s",info.flight_number);
printf("请输入出发地:\n");
scanf("%s",info.departure);
printf("请输入目的地:\n");
scanf("%s",info.destination);
printf("请输入起飞时间:\n");
scanf("%s",info.take_off_time);
printf("请输入价格:\n");
scanf("%f",&info.price);
return info;
}
void main(){
F_List list = NULL; //创建航班信息链表
int fun;
char *f_num = (char *)malloc(sizeof(char));
Info_t info;
float new_price;
while (1)
{
Flight_Interface();
printf("请输入数字选择功能:");
scanf("%d",&fun);
switch (fun)
{
case 1:
list = Flight_Create();
printf("初始化成功\n");
break;
case 2:
printf("请输入航班编号:");
scanf("%s",f_num);
Flight_FlightNumberFind(list,f_num);
break;
case 3:
printf("请输入需要删除的航班信息:");
scanf("%s",f_num);
if(Flight_FlightNumberDel(list,f_num))
printf("删除成功\n");
else printf("删除失败\n");
break;
case 4:
Flight_print(list);
break;
case 5:
printf("请输入需要修改的航班号:");
scanf("%s",f_num);
printf("请输入新的机票价格:");
scanf("%f",&new_price);
Flight_PriceRevise(list,f_num,new_price);
break;
case 6:
info = setInfo();
// 向链表中插入航班信息
Flight_TailInsert(list,info);
printf("插入成功!\n");
break;
default:
break;
}
}
}