用所学过的C语言,以及链表相关知识,实现一个航班信息的录入、查询、显示、排序等功能。 航班信息节点设计,请参见附录。 2、 基本功能: 1) 录入航班信息(可以直接从键盘录入,也可通过文件存储) 2) 显示所有航班信息 3) 按照查询要求(比如日期、地点等),列出相关的航班信息。 3、 扩展要求: 1) 对录入的信息进行排序,给用户提供几种选择(比如按起飞时间排序、按起飞地址排序、票价等) 2) 能够将录入的信息存入本地,程序下次启动自动读取日志文件,从而获取上次运行的数据。
时间: 2023-12-03 13:42:56 浏览: 110
flight_demo.rar_数据结构_Unix_Linux_
实现以上功能的代码如下:
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义航班信息结构体
typedef struct flight_info {
char date[20]; // 起飞日期
char time[20]; // 起飞时间
char from[50]; // 起飞地点
char to[50]; // 目的地
int price; // 票价
struct flight_info *next; // 指向下一个航班信息节点的指针
} FlightInfo;
// 定义全局变量,指向航班信息链表的头节点
FlightInfo *head = NULL;
// 函数声明
void add_flight_info();
void show_all_flight_info();
void search_flight_info();
void sort_flight_info();
void save_flight_info();
void load_flight_info();
int main() {
int choice;
do {
printf("\n1. 录入航班信息\n");
printf("2. 显示所有航班信息\n");
printf("3. 搜索航班信息\n");
printf("4. 排序航班信息\n");
printf("5. 保存航班信息到文件\n");
printf("6. 从文件加载航班信息\n");
printf("0. 退出程序\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_flight_info();
break;
case 2:
show_all_flight_info();
break;
case 3:
search_flight_info();
break;
case 4:
sort_flight_info();
break;
case 5:
save_flight_info();
break;
case 6:
load_flight_info();
break;
case 0:
printf("\n程序已退出。\n");
break;
default:
printf("\n输入的操作选择不正确,请重新输入。\n");
break;
}
} while (choice != 0);
return 0;
}
// 添加航班信息
void add_flight_info() {
printf("\n请输入航班信息:\n");
// 创建新节点
FlightInfo *new_node = (FlightInfo*)malloc(sizeof(FlightInfo));
printf("起飞日期(格式:yyyy-mm-dd):");
scanf("%s", new_node->date);
printf("起飞时间(格式:hh:mm):");
scanf("%s", new_node->time);
printf("起飞地点:");
scanf("%s", new_node->from);
printf("目的地:");
scanf("%s", new_node->to);
printf("票价:");
scanf("%d", &new_node->price);
new_node->next = NULL;
// 添加节点到链表
if (head == NULL) {
head = new_node;
} else {
FlightInfo *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
printf("航班信息添加成功。\n");
}
// 显示所有航班信息
void show_all_flight_info() {
if (head == NULL) {
printf("没有航班信息可供显示。\n");
} else {
printf("\n所有航班信息:\n");
printf("日期\t\t时间\t\t起飞地点\t目的地\t票价\n");
FlightInfo *p = head;
while (p != NULL) {
printf("%s\t%s\t%s\t\t%s\t%d\n", p->date, p->time, p->from, p->to, p->price);
p = p->next;
}
}
}
// 搜索航班信息
void search_flight_info() {
char query[50];
printf("\n请输入查询关键字:");
scanf("%s", query);
printf("\n查询结果:\n");
printf("日期\t\t时间\t\t起飞地点\t目的地\t票价\n");
FlightInfo *p = head;
while (p != NULL) {
if (strstr(p->date, query) != NULL || strstr(p->time, query) != NULL ||
strstr(p->from, query) != NULL || strstr(p->to, query) != NULL) {
printf("%s\t%s\t%s\t\t%s\t%d\n", p->date, p->time, p->from, p->to, p->price);
}
p = p->next;
}
}
// 排序航班信息
void sort_flight_info() {
int choice;
printf("\n请选择排序方式:\n");
printf("1. 按起飞时间排序\n");
printf("2. 按起飞地址排序\n");
printf("3. 按票价排序\n");
printf("请选择排序方式:");
scanf("%d", &choice);
switch (choice) {
case 1: {
// 按起飞时间排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (strcmp(p->time, q->time) > 0) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按起飞时间排序后的航班信息:\n");
show_all_flight_info();
break;
}
case 2: {
// 按起飞地址排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (strcmp(p->from, q->from) > 0) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按起飞地址排序后的航班信息:\n");
show_all_flight_info();
break;
}
case 3: {
// 按票价排序
FlightInfo *p, *q, *tail = NULL;
while (head != tail) {
for (p = head; p->next != tail; p = p->next) {
q = p->next;
if (p->price > q->price) {
// 交换两个节点
char temp_date[20], temp_time[20], temp_from[50], temp_to[50];
int temp_price;
strcpy(temp_date, p->date);
strcpy(temp_time, p->time);
strcpy(temp_from, p->from);
strcpy(temp_to, p->to);
temp_price = p->price;
strcpy(p->date, q->date);
strcpy(p->time, q->time);
strcpy(p->from, q->from);
strcpy(p->to, q->to);
p->price = q->price;
strcpy(q->date, temp_date);
strcpy(q->time, temp_time);
strcpy(q->from, temp_from);
strcpy(q->to, temp_to);
q->price = temp_price;
}
}
tail = p;
}
printf("\n按票价排序后的航班信息:\n");
show_all_flight_info();
break;
}
default:
printf("\n输入的操作选择不正确,请重新输入。\n");
break;
}
}
// 保存航班信息到文件
void save_flight_info() {
char filename[50];
printf("\n请输入要保存的文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "w");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
FlightInfo *p = head;
while (p != NULL) {
fprintf(fp, "%s %s %s %s %d\n", p->date, p->time, p->from, p->to, p->price);
p = p->next;
}
fclose(fp);
printf("航班信息已保存到文件:%s\n", filename);
}
// 从文件加载航班信息
void load_flight_info() {
char filename[50];
printf("\n请输入要加载的文件名:");
scanf("%s", filename);
FILE *fp = fopen(filename, "r");
if (fp == NULL) {
printf("文件打开失败。\n");
return;
}
head = NULL;
while (!feof(fp)) {
// 创建新节点
FlightInfo *new_node = (FlightInfo*)malloc(sizeof(FlightInfo));
fscanf(fp, "%s %s %s %s %d\n", new_node->date, new_node->time, new_node->from, new_node->to, &new_node->price);
new_node->next = NULL;
// 添加节点到链表
if (head == NULL) {
head = new_node;
} else {
FlightInfo *p = head;
while (p->next != NULL) {
p = p->next;
}
p->next = new_node;
}
}
fclose(fp);
printf("航班信息已从文件:%s 加载完毕。\n", filename);
}
```
附录:航班信息节点设计
```
typedef struct flight_info {
char date[20]; // 起飞日期
char time[20]; // 起飞时间
char from[50]; // 起飞地点
char to[50]; // 目的地
int price; // 票价
struct flight_info *next; // 指向下一个航班信息节点的指针
} FlightInfo;
```
阅读全文