Sistema de gestión de vuelos basado en lista enlazada circular bidireccional.

1. Función de encabezado

#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 funciones

Se agrega una nueva operación de archivo para guardar el archivo de entrada de datos o cargar el archivo en la pantalla.

#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. Función principal

#include "link.c"

int main()
{   
	
	Main_Window();
	
	return 0;
}

4. Imágenes de operación

2.txt no es necesario crearlo, se creará automáticamente cuando el archivo no exista

Supongo que te gusta

Origin blog.csdn.net/apple_71040140/article/details/132227780
Recomendado
Clasificación