1. Função de cabeçalho
#ifndef _HEAD_H_
#define _HEAD_H_
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
typedef struct flight_Info //航班信息数据结构
{
char number[18]; //航班号
char start_station[20]; //起点站
char terminus[20]; //终点站
char DATE[12]; //航班行程日期
char Air_Type[8]; //机型
char start_time[20]; //起飞时间
char arrive_time[20]; //到达时间
}flight, *pflight;
typedef struct node //双向链表结点
{
flight data;
struct node *next;
struct node *prev;
}node, *pnode;
void Main_Window(char *pathname); //主窗口,选择界面
node *create_Init(); //初始化创建节点
void Node_insert_tail(node *head); //添加航班信息
void delete_flight(node *head); //删除航班信息
void Show_flight(node *head); //查看航班信息
void Update_time(node *head); //修改航班时间信息
void Ser_Line(node *head); //搜索航班
void Sort_Line(node *head); //排序
void Save_Line_InFile(node* head,char **pathname); //将数据保存到文件中
void load_File(node* head,char **pathname);
void Node_insert(node *head,node* New_node); //文件插入操作
#endif
2. Implementar funções
Uma nova operação de arquivo é adicionada para salvar o arquivo de entrada de dados ou carregar o arquivo na tela.
#include "link.h"
//统计节点个数
static int Count = 0;//统计节点数目
node *create_Init() //创建头节点并初始化
{
node *phead = (node *)malloc(sizeof(node));
if (NULL == phead)
{
printf("头节点申请错误\n");
return NULL;
}
phead->next = phead; //定义成双向循环链表
phead->prev = phead;
return phead;
}
void Node_insert_tail(node *head) //添加航班(管理员)
{
node *pnew = (node *)malloc(sizeof(node)); //在堆空间申请,创建新结点
if (pnew == NULL)
{
printf("申请失败!");
}
if (head != NULL)
{
head->prev->next = pnew; //链接新结点
pnew->prev = head->prev;
head->prev = pnew;
pnew->next = head;
printf("航班号:\n");
scanf("%s", pnew->data.number);
printf("起点站:\n");
scanf("%s", pnew->data.start_station);
printf("终点站:\n");
scanf("%s", pnew->data.terminus);
printf("航班行程日期:\n");
scanf("%s", pnew->data.DATE);
printf("机型:\n");
scanf("%s", pnew->data.Air_Type);
printf("起飞时间:\n");
scanf("%s", pnew->data.start_time);
printf("到达时间:\n");
scanf("%s", pnew->data.arrive_time);
printf("\n添加完成, 正在跳转至主界面,请稍候~\n");
sleep(3);
system("clear");
}
Count++;
}
void Delete_flight(node *head) //删除航班信息
{
if (head == NULL)
{
printf("传入失败!");
}
node *ptemp = head; //定义临时结点
char number1[18];
printf("请输入要删除的航班号:\n");
scanf("%s",number1);
while (ptemp == head)
{
ptemp = ptemp->next;
}
if (!(strcmp(number1,ptemp->data.number)))
{
ptemp->prev->next = ptemp->next; //将旧结点断开,连接新结点
ptemp->next->prev = ptemp->prev;
printf("\n\n删除成功!");
free(ptemp);
Count--;
ptemp = NULL;
return;
}
//遍历寻找航班号
printf("未找到此航班号,请检查是否输入错误!\n");
}
void Show_flight(node *head) //查看航班信息
{
if (head == NULL)
{
printf("传入失败!");
}
node *ptemp = head; //临时节点遍历
printf("航班号 起点站 终点站 航班行程日期 机型 起飞时间 到达时间\n\n");
do
{
ptemp = ptemp->next;
printf("%s %s %s %s %s %s %s\n\n", ptemp->data.number, ptemp->data.start_station,
ptemp->data.terminus, ptemp->data.DATE, ptemp->data.Air_Type, ptemp->data.start_time, ptemp->data.arrive_time);
}while (ptemp != head);
}
void Update_time(node *head) //修改航班信息
{
if (head == NULL)
{
printf("传入失败!");
}
node *ptemp = head; //定义临时节点,遍历
char number1[18];
char time[20]; //修改后的时间
printf("\n请输入要修改的航班号:");
scanf("%s",number1);
do{
ptemp = ptemp->next;
if (!(strcmp(number1,ptemp->data.number)))
{
//删除航班,再添加
ptemp->prev->next = ptemp->next; //将旧结点断开,连接新结点
ptemp->next->prev = ptemp->prev;
//printf("\n\n删除成功!");
free(ptemp);
ptemp = NULL;
Node_insert_tail(head);
printf("修改成功!\n");
return;
}
}while (ptemp != head);
printf("未找到此航班号,请检查是否输入错误!\n");
}
//排序,比较节点数据域大小移动节点
//比较相邻的两个函数的数据域大小冒泡排序中移动节点
//排序的临界条件,通过输入函数进行统计。
void Sort_Line(node *head)
{
if(head ==NULL)
{
printf("传入失败!");
}
int i=0,j=0;
node *p = head;//两个相邻的节点p和pnext
node *pnext = head;
for(i=0;i<Count-1;i++)
{
p=head->next;
pnext=p->next;
for(j=0;j<Count-i-1;j++)
{
if((p->data.DATE)<(pnext->data.DATE))
{
if(pnext->next==NULL)//判断是否是尾节点
{
p->next=pnext->next;
pnext->prev=p->prev;
pnext->next=p;
p->prev->next=pnext;
p->prev=pnext;
}else {
p->next=pnext->next;
pnext->prev=p->prev;
pnext->next->prev=p;
p->prev->next=pnext;
pnext->next=p;
p->prev=pnext;
pnext=p->next;
}
p=p->next;
pnext=p->next;
}
}
}
}
//通过查看航班的起始地和目的地进行搜索
void Ser_Line(node *head)
{
if(head ==NULL)
{
printf("传入失败!");
}
int t=0;
char arrive[20];//到达时间
char start[20];//起始时间
printf("请输入航班的起始地址:\n");
scanf("%s",start);
printf("请输入航班的目的地址:\n");
scanf("%s",arrive);
printf("正在查询,请稍等 亲\n");
node *ptemp=head->next;
printf("航班号 起点站 终点站 航班行程日期 机型 起飞时间 到达时间\n\n");
while(ptemp!=head)
{
t = !(strcmp(ptemp->data.start_time,start) | strcmp(ptemp->data.arrive_time,arrive));
if(t)
{
printf("%s %s %s %s %s %s %s\n\n", ptemp->data.number, ptemp->data.start_station,
ptemp->data.terminus, ptemp->data.DATE, ptemp->data.Air_Type, ptemp->data.start_time, ptemp->data.arrive_time);
}
ptemp=ptemp->next;
}
printf("查询完成\n");
}
void Save_Line_InFile(node* head,char **pathname)
{
node *ptemp=head;
FILE *fp;
char buf[160];
//打开文件
if((fp = fopen(*pathname,"w+")) == NULL)
{
perror("fopen");
exit(1);
}
do
{
ptemp = ptemp->next;
sprintf(buf,"%s %s %s %s %s %s %s\n", ptemp->data.number, ptemp->data.start_station,
ptemp->data.terminus, ptemp->data.DATE, ptemp->data.Air_Type, ptemp->data.start_time, ptemp->data.arrive_time);
fputs(buf,fp);
printf("2");
}while(ptemp!=head);
fclose(fp);
}
void load_File(node* head,char **pathname)
{
node *ptemp;
FILE *fp;
char buf[200];
//打开文件
if((fp = fopen(*pathname,"a")) == NULL){
perror("fopen");
exit(1);
}
//从文件读取学生信息,并保存到链表中
while(fgets(buf,sizeof(buf),fp) != NULL){
ptemp=(node*)malloc(sizeof(*ptemp));
if(NULL == ptemp){
perror("malloc");
exit(1);
}
sscanf(buf,"%s %s %s %s %s %s %s", ptemp->data.number, ptemp->data.start_station,
ptemp->data.terminus, ptemp->data.DATE, ptemp->data.Air_Type, ptemp->data.start_time, ptemp->data.arrive_time);
Node_insert(head,ptemp);
}
printf("加载信息成功!");
fclose(fp);
}
void Node_insert(node *head,node* New_node)
{
node *temp = (node *)malloc(sizeof(node)); //在堆空间申请,创建新结点
temp=New_node;
temp->prev = head;
temp->next = head->next;
if(head->next!=NULL)
head->next->prev = temp;
head->next = temp;
}
void Main_Window(char *pathname)
{
node * head=create_Init(); //头结点初始化
int option;
menu: printf("\n");
printf("********************************************************\n");
printf("* *\n");
printf("* 欢迎光临航班管理系统 *\n");
printf("* *\n");
printf("********************************************************\n");
printf("********************************************************\n");
printf("-------------------<1>添加航班信息----------------------\n");
printf("-------------------<2>删除航班信息----------------------\n");
printf("-------------------<3>修改航班信息----------------------\n");
printf("-------------------<4>查询航班信息----------------------\n");
printf("-------------------<5>搜索航班信息----------------------\n");
printf("-------------------<6>航班信息排序----------------------\n");
printf("-------------------<7>航班信息保存----------------------\n");
printf("-------------------<8>加载航班信息----------------------\n");
printf("-------------------<9>退出管理系统----------------------\n");
printf("\n");
printf("请输入需要执行的选项(填写数字选项):\n");
scanf("%d",&option);
switch(option)
{
case 1:
Node_insert_tail(head);
goto menu;
case 2:
Delete_flight(head);
goto menu;
case 3:
Update_time(head);
goto menu;
case 4:
Show_flight(head);
goto menu;
case 5:
Ser_Line(head);
goto menu;
case 6:
Sort_Line(head);
goto menu;
case 7:
Save_Line_InFile(head,&pathname);
goto menu;
case 8:
load_File(head,&pathname);
goto menu;
case 9:
printf("欢迎您再次使用!再见!\n");
break;
default:
printf("请输入正确的选项!");
goto menu;
}
}
3. Função principal
#include "link.c"
int main()
{
Main_Window();
return 0;
}
4. Imagens de operação
2.txt não precisa ser criado, ele será criado automaticamente quando o arquivo não existir