博客:http://blog.csdn.net/muyang_ren
1、实现功能:
1)信息录入
2)信息显示(按照起飞时间先后顺序显示)
3)信息查询(可根据不同的关键字进行查询)
4)信息删除
2、 要求:
1)使用链表对录入的信息进行存储
2)对录入的信息进行排序(可按起飞时间进行排序)
3)Make管理项目
3、结构体:
struct flydate{ int ID; //航班号 char staddress[18]; //起点站 char arraddress[18]; //终点站 char DATE[12]; //班期 char TYPE[8]; //机型 char stime[10]; //起飞时间 char atime[10]; //到达时间 int value; //票价 struct flydate *next; };
fly_head.h
/************************************************************************* > File Name: fly_head.h > Author: 梁惠涌 > Addr: > Created Time: 2015年04月12日 星期日 05时57分34秒 ************************************************************************/ #ifndef _FLY_HEAD_H #define _FLY_HEAD_H #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include "print.h" typedef struct flydate{ int ID; //航班号 char staddress[18]; //起点站 char arraddress[18]; //终点站 char DATE[12]; //班期 char TYPE[8]; //机型 char stime[10]; //起飞时间 char atime[10]; //到达时间 int value; //票价 struct flydate *next; }fly_list,*fly_plist; volatile static fly_plist plist; volatile static int flag = 1; extern void linklist_new(); extern void DataToList(FILE *,fly_plist *); extern void IS_load_file(); extern void show_list(char *); extern void *show_main(void *); extern void AddMation_list(); extern void Delete_List(); extern void save_ListToFile(); extern void show_beybey(); extern void linklist_plist(); extern void Reorder_list(); extern void delete_1(); extern void delete_2(); #endif
main.c
/************************************************************************* > File Name: 项目:航班查询系统 > Author: 梁惠涌 > Addr: > Created Time: 2015年04月12日 星期日 05时32分24秒 ************************************************************************/ #include "fly_head.h" int main(){ int choice_num; //给全局变量plist初始化 linklist_plist(); show_list("| 欢迎使用航班查询系统! |\n"); //判断本地文件是否有内容 IS_load_file(); /*----------------线程(航班信息显示)-------------------------*/ static pthread_t thread_tid1; //定义线程标识符 //创建线程显示航班信息 if(pthread_create(&thread_tid1, NULL, show_main, NULL)< 0){ perror("创建线程失败!\n"); exit(-1); } /*------------------------------------------------------*/ while(1){ scanf("%d",&choice_num); switch(choice_num){ case 1: AddMation_list(); break; //增加航班信息 case 2: Reorder_list(); break; //航班信息排序并保存本地 case 3: Delete_List(); break; //删除航班信息 case 4: show_beybey();break; //退出系统 default: while(getchar()!='\n');break; //清除输入其他字符的缓存 } } pthread_join(thread_tid1, NULL); return 0; }
fly_achieve.c
/************************************************************************* > File Name: 功能实现函数 > Author: 梁惠涌 > Addr: > Created Time: 2015年04月12日 星期日 06时00分56秒 ************************************************************************/ #include "fly_head.h" //加载界面 void show_list(char *str){ system("clear"); system("clear"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 航班查询系统 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("%s",str); printf("| |\n"); printf("| |\n"); printf("| |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); sleep(1.5); } //显示航班信息界面 void *show_main(void *arg){ fly_plist p, p1, p2, p3, p4, p5; while(1){ if( flag == -1 ){ exit(-1); } while(flag==1){ system("clear"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 航班查询系统 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 航班号 | 起点站 | 终点站 | 班期 | 机型 | 起飞 | 到达 | 票价 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); if(p!= NULL){ printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p->ID,p->staddress,p->arraddress,p->DATE,p->TYPE,p->stime,p->atime,p->value); }else printf("| | | | | | | | |\n"); if((p!=NULL) && (p->next != NULL)){ p1=p->next; printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p1->ID,p1->staddress,p1->arraddress,p1->DATE,p1->TYPE,p1->stime,p1->atime,p1->value); }else printf("| | | | | | | | |\n"); if( (p!=NULL) && (p->next != NULL) && (p->next->next != NULL)){ p2=p->next->next; printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p2->ID,p2->staddress,p2->arraddress,p2->DATE,p2->TYPE,p2->stime,p2->atime,p2->value); }else printf("| | | | | | | | |\n"); if((p!=NULL) && (p->next != NULL) && (p->next->next != NULL) && (p->next->next->next != NULL)){ p3=p->next->next->next; printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p3->ID,p3->staddress,p3->arraddress,p3->DATE,p3->TYPE,p3->stime,p3->atime,p3->value); }else printf("| | | | | | | | |\n"); if((p!=NULL) && (p->next != NULL) && (p->next->next != NULL) && (p->next->next->next != NULL)&&(p->next->next->next->next!=NULL)){ p4=p->next->next->next->next; printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p4->ID,p4->staddress,p4->arraddress,p4->DATE,p4->TYPE,p4->stime,p4->atime,p4->value); }else printf("| | | | | | | | |\n"); if((p!=NULL) && (p->next != NULL) && (p->next->next != NULL) && (p->next->next->next != NULL)&&(p->next->next->next->next!=NULL)&&(p->next->next->next->next->next != NULL)){ p5=p->next->next->next->next->next; printf("| %7d | %8s | %8s | %5s | %8s |%8s |%8s | ¥%5d |\n",p5->ID,p5->staddress,p5->arraddress,p5->DATE,p5->TYPE,p5->stime,p5->atime,p5->value); }else printf("| | | | | | | | |\n"); if(p!=NULL) p=p->next; if(p == NULL){ p=plist->next; } printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 功能键 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 1-增加航班信息 | 2-快速一键排序 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 3-删除航班信息 | 4-退出航班系统 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); sleep(1.5); } } } //增加航班数据 KO void AddMation_list(){ flag = 0; fly_plist new, h=plist; linklist_new(&new); system("clear"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 增加航班数据(空格隔开) |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 航班号 | 起点站 | 终点站 | 班期 | 机型 | 起飞 | 到达 | 票价 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("请输入航班号:"); scanf("%d",&(new->ID)); printf("请输入起点站:"); scanf("%s", new->staddress); printf("请输入终点站:"); scanf("%s",new->arraddress); printf("请输入班期:"); scanf("%s",new->DATE); printf("请输入机型:"); scanf("%s",new->TYPE); printf("请输入起飞时间:"); scanf("%s", new->stime); printf("请输入到达时间:"); scanf("%s", new->atime); printf("请输入票价:"); scanf("%d",&(new->value)); while( getchar()!= '\n'); while((h->next) != NULL){ h = h->next; } h->next = new; save_ListToFile(); sleep(1); flag = 1; } //单链表从小到大排序 //第一个for(外循环) //f1,外循环指向链表第一个有数据的结点(plist结点内是无数据的) //last_f1,指向f1的前一个节点 // //第二个for(内循环) //f1指向比较的第一个结点,比较往后,last_f1往后移一位,f1再继续指向last_f1->next, //lenght,统计有数据的节点的长度 void Reorder_list(){ flag = 0; int list_flag = 0; int i, j, lenght=0; fly_plist p=plist->next; fly_plist f1, last_f1, swap; while(p != NULL){ p=p->next; lenght++; } for(i=lenght; i>1; i--){ last_f1 = plist; //外循环,last_f1,f1重新指向 f1=plist->next; for(j=i; j>1; j--){ //if(f1->ID > f1->next->ID){ if(strcmp(f1->stime,f1->next->stime)>0){ list_flag = 1; swap = f1->next; //保存f1->next的值 f1->next = f1->next->next; //将f1->next从链表里断开 last_f1->next = swap; //将swap的节点接在f1前面 last_f1->next->next = f1; } last_f1 = last_f1->next; //last_f1 往后移一位 f1 = last_f1->next; //内循环,f1指向last_f1的后一个节点 } if(list_flag == 0){ break; } } show_list("| 排序完成!!! |\n"); save_ListToFile(); //将链表内数据存入本地 flag = 1; } //删除航班数据主界面 KO void Delete_List(){ flag = 0; int num; int flag_delete=1; while(flag_delete==1){ system("clear"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 删除航班数据 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 1-按航班号删除 | 2-按班期删除 | 3-退出删除操作 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 提示:比如按航班号删除,相同的航班号都会被删除 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf(">>请输入选项:"); scanf("%d",&num); switch(num){ case 1: delete_1(); break; case 2: delete_2(); break; case 3: flag_delete = 0 ;break; default: while(getchar()!='\n'); break; } } flag = 1; } //按航班号删除数据 KO void delete_1(){ int id_num, id_flag=0; system("clear"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 按航班号删除 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); printf("| 提示:相同的航班号都会被删除 |\n"); printf("|--------------------------------------------------------------------------------------------|\n"); fly_plist p3=plist->next; printf("航班号: "); while(p3 != NULL){ printf("%d\t",p3->ID); p3 = p3->next; } printf("\n>>请输入删除航班号:"); scanf("%d",&id_num); fly_plist p1,p2; p1=plist; p2=p1->next; while(p2!=NULL){ if(p2->ID==id_num){ free(p2); p2=p2->next; p1->next=p1->next->next; id_flag = 1; printf("执行->删除航班ID:%d ...\n", id_num); }else{ p1=p1->next; p2=p2->next; } } if(id_flag==0){ printf("没有找到该航班号!!!\n"); } if(id_flag == 1){ save_ListToFile(); } while(getchar() != '\n'); //清除其他字符的缓存 sleep(1.5); } //按班期删除航班数据 KO void delete_2(){ int data_flag = 0; char data[12]; system("clear"); printf("|----------------------------------------------------------------------------|\n"); printf("| 按班期数据 |\n"); printf("|----------------------------------------------------------------------------|\n"); printf("| 提示:相同的班期号航班都会被删除 |\n"); printf("|----------------------------------------------------------------------------|\n"); fly_plist p3=plist->next; printf("班期: "); while(p3 != NULL){ printf("%s\t",p3->DATE); p3 = p3->next; } printf("\n>>请输入删除班期:"); scanf("%s", data); fly_plist p1,p2; p1=plist; p2=p1->next; while(p2!=NULL){ if(strcmp(p2->DATE,data)==0){ free(p2); p2=p2->next; p1->next=p1->next->next; data_flag = 1; printf("执行->删除航班 班期:%s ...\n", data); }else{ p1=p1->next; p2=p2->next; } } if(data_flag == 0) printf("没有找到该班期航班!!!\n"); if(data_flag == 1){ save_ListToFile(); } while(getchar() != '\n'); //清除其他字符的缓存 sleep(1.5); } //将链表数据保存到本地文件 KO void save_ListToFile(){ FILE *fp; fly_plist p=plist->next; //临时指针 if((fp = fopen("fly_date.bat","wb"))!=NULL){ printf("已打开文件!!!\n"); while( p != NULL ){ fwrite(p, sizeof(fly_list),1,fp); p=p->next; } } else perror("打开本地文件失败!!!"); show_list("| 本地数据已更新!!! |\n"); fclose(fp); } void show_beybey(){ flag = 0; show_list("| 正在退出!!! |\n"); save_ListToFile(); //保存到本地文件 flag = -1; } //加载本地文件数据 KO void IS_load_file(){ FILE *fp; fly_plist new; fly_plist p=plist; //临时指针 if((fp = fopen("fly_date.bat","a+"))!=NULL) { // DataToList(&fp,plist); int i=0; for(;!feof(fp); i++){ linklist_new(&new); fread(new, sizeof(fly_list),1,fp); if((new->value) != 0 ){ new->next = p->next; p->next=new; p=p->next; } } } else show_list("| 打开本地文件失败!!! |\n"); show_list("| 加载本地文件成功!!! |\n"); fclose(fp); } //开辟全局变量 plist 新的节点空间 KO void linklist_plist(){ plist=(fly_plist)malloc(sizeof(fly_list)); if(NULL == plist){ perror("malloc\n"); exit(-1); } plist->next=NULL; } //开辟新的节点空间 KO void linklist_new(fly_plist *new){ *new=(fly_plist)malloc(sizeof(fly_list)); if(NULL == *new){ perror("malloc\n"); exit(-1); } (*new)->next=NULL; }
#自动编译多个.c构成的项目,即把所有的.c编译成同一个可执行文件 CC:=gcc CFLAGS:=-Wall -g -lpthread SRC:=${wildcard *.c} #将当前目录下的以.c为后缀的文件名赋给SRC OBJ:=${patsubst %.c,%.o,$(SRC)}#将Src中以.c为后缀的字符串替换成.o为后缀赋给OBJ test:$(OBJ) $(CC) -o $@ $^ $(CFLAGS) %.o:%.c myhead.h $(CC) -o $@ -c $< $(CFLAGS) .PHONY:clean print clean: @rm -f *.o test .*.sw? print: @echo $(SRC) @echo $(OBJ)
喜羊羊系列之【项目一】:c基础+数据结构+线程+冒泡实现《航班查询系统》
原文地址:http://blog.csdn.net/muyang_ren/article/details/45131049