航班資訊檢索與查詢(基數排序)
阿新 • • 發佈:2019-02-19
花了一週的時間搞資料結構課程設計,現在想起來也不咋樣。
航班資訊檢索與查詢系統原始碼 在”StdAfx.h”檔案中: #if !defined(AFX_STDAFX_H__5D4863DA_370E_4BF2_ACA1_DEF9B55C465C__INCLUDED_) #define AFX_STDAFX_H__5D4863DA_370E_4BF2_ACA1_DEF9B55C465C__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif #define WIN32_LEAN_AND_MEAN #include <stdio.h> #include <string.h> #include"stdlib.h" #include"cctype" #endif 在”StdAfx.cpp”檔案中: #include "stdafx.h" 在” 航班資訊檢索與查詢.h”檔案中: void Menu(); void Menu2(); void Save(); int Bsearch(int l,int r); void Read_Inf(); void Search_Inf(int f); void Add_Inf(); void Del_Inf(); void Dis_Inf(int k,int f); bool Choice(char *s); void Get_Tiket(); void Exit(); #define Max 100005 #define Maxn 36 #define N 20 typedef struct Plan{ char ID[10]; char start[N]; char end[N]; int money; int space; char Tdate[N]; char Tstart[N]; char Tend[N]; char name[N]; }PlanNode; typedef struct Node{ char key[10]; PlanNode inf; int next; }SLNode; typedef struct{ SLNode s[Max]; int keyCnt; int PCnt; }SList; void Radix_Sort(SList &L); 在” 航班資訊檢索與查詢.cpp”檔案中: #include "stdafx.h" #include"航班資訊檢索與查詢.h" int x[Maxn],y[Maxn]; const int form[]={8,8,7,8,9,9,7,5,4}; SList L; int main(int argc, char* argv[]) { system("color 6"); L.PCnt=0; L.keyCnt=6; Read_Inf(); Menu(); return 0; } void Menu() { char ch[]=" "; printf("%s┍┅┅┅┅┅┅┅┅┅┅┅┅┒\n",ch); printf("%s│ 航班資訊檢索與查詢 │\n",ch); printf("%s┕┅┅┅┅┅┅┅┅┅┅┅┅┘\n",ch); printf("%s┍┅┅┅┅┅┅┅┅┅┅┅┅┒\n",ch); printf("%s│ 1.查詢航班資訊 │\n",ch); printf("%s│ 2.顯示全部航班資訊 │\n",ch); printf("%s│ 3.新增航班資訊 │\n",ch); printf("%s│ 4.訂票 │\n",ch); printf("%s│ 5.退出 │\n",ch); printf("%s┕┅┅┅┅┅┅┅┅┅┅┅┅┘\n",ch); printf("請選擇相應的功能:"); scanf("%s",ch); while(Choice(ch)==0){ printf("輸入不合法,請重新輸入:"); scanf("%s",ch); } switch(ch[0]){ case'1':Menu2();break; case'2':Dis_Inf(0,2);break; case'3':Add_Inf();break; case'4':Get_Tiket();break; case'5':Exit();break; default:printf("沒有該選項!\n");break; } system("pause"); system("cls"); Menu(); } void Menu2() { char ch[]=" "; printf("%s┍┅┅┅┅┅┅┅┅┅┅┅┅┒\n",ch); printf("%s│ 1.按航班號查詢 │\n",ch); printf("%s│ 2.按起點查詢 │\n",ch); printf("%s│ 3.按終點查詢 │\n",ch); printf("%s│ 4.按起飛時間查詢 │\n",ch); printf("%s│ 5.按到達時間查詢 │\n",ch); printf("%s│ 6.退出 │\n",ch); printf("%s┕┅┅┅┅┅┅┅┅┅┅┅┅┘\n",ch); printf("請選擇相應的查詢要求:"); scanf("%s",ch); while(Choice(ch)==0){ printf("輸入不合法,請重新輸入:"); scanf("%s",ch); } switch(ch[0]){ case'1':Bsearch(1,L.PCnt+1);break; case'2':Search_Inf(2);break; case'3':Search_Inf(3);break; case'4':Search_Inf(4);break; case'5':Search_Inf(5);break; case'6':goto loop; default:printf("沒有該選項!\n");break; } printf("是否繼續(y/n):"); scanf("%s",ch); if(ch[0]=='y'||ch[0]=='Y') Menu2(); loop:return; } void print(char *s,int d) { int k=form[d]; int len=strlen(s); printf("%s",s); for(int i=0;i<k-len;i++) printf(" "); printf(" "); } void print1(int s,int d) { int k=form[d]; int len=0; printf("%d",s); while(s) s=s/10,len++; for(int i=0;i<k-len;i++) printf(" "); } void Read_Inf() { FILE *fp; if((fp=fopen("Plan_Inf.txt","rb"))!=NULL){ for(L.PCnt=1;fread(&L.s[L.PCnt].inf,sizeof(PlanNode),1,fp);L.PCnt++){ strcpy(L.s[L.PCnt].key,L.s[L.PCnt].inf.ID); } fclose(fp); L.PCnt--; } else{ printf("尚還沒有可用資料!\n"); } } void Save() { FILE *fp; if((fp=fopen("Plan_Inf.txt","wb"))==NULL){ printf("檔案開啟失敗\n"); } for(int i=1;i<=L.PCnt;i++){ if((fwrite(&L.s[i].inf,sizeof(PlanNode),1,fp))==0) printf("儲存資料出錯\n"); } } bool Choice(char *s) { int len=strlen(s); if(len==1&&s[0]>='1'&&s[0]<'10') return 1; return 0; } void Exit() { Save(); printf("謝謝使用!\n"); exit(0); } void Distr_Radix(SLNode *s,int i) { int j; memset(x,0,sizeof(x)); for(int k=s[0].next;k;k=s[k].next) { if(L.s[k].key[i]>'=A'&&L.s[k].key[i]<='Z') j=L.s[k].key[i]-'A'+10; else j=L.s[k].key[i]-'0'; if(!x[j]) x[j]=k; else s[y[j]].next=k; y[j]=k; } } void Coll_Radix(SLNode *s) { for(int j=0;x[j]==0;j++); s[0].next=x[j]; int tmp=y[j]; while(j<Maxn-1){ for(j=j+1;j<Maxn-1&&!x[j];j++); if(y[j]){ s[tmp].next=x[j]; tmp=y[j]; } } s[tmp].next=0; } void Get_Sql(SList &L) { int k,k1,i; SLNode tmp; k=L.s[0].next; for(i=1;i<=L.PCnt;i++){ while(k<i) k=L.s[k].next; k1=L.s[k].next; if(k!=i){ tmp=L.s[k]; L.s[k]=L.s[i]; L.s[i]=tmp; L.s[i].next=k; } k=k1; } } void Radix_Sort(SList &L) { for(int i=0;i<L.PCnt;i++) L.s[i].next=i+1; L.s[L.PCnt].next=0; for(i=L.keyCnt-1;i>=0;--i) { Distr_Radix(L.s,i); Coll_Radix(L.s); } Get_Sql(L); } void Dis_Inf(int k,int flag=2) { if(flag==1) { printf(" ┌────────────────────────────────────┐\n"); printf(" │航班號│ 班期 │ 起點 │ 終點 │起飛時間│到達時間│ 機型 │票價│票數│\n"); printf(" "); print(L.s[k].inf.ID,0); print(L.s[k].inf.Tdate,1); print(L.s[k].inf.start,2); print(L.s[k].inf.end,3); print(L.s[k].inf.Tstart,4); print(L.s[k].inf.Tend,5); print(L.s[k].inf.name,6); print1(L.s[k].inf.money,7); print1(L.s[k].inf.space,8); printf("\n"); printf(" ┕────────────────────────────────────┘\n"); } else{ printf("┌────────────────────────────────────┐\n"); printf("│航班號│ 班期 │ 起點 │ 終點 │起飛時間│到達時間│ 機型 │票價│票數│\n"); for(int i=1;i<=L.PCnt;i++){ printf(" "); print(L.s[i].inf.ID,0); print(L.s[i].inf.Tdate,1); print(L.s[i].inf.start,2); print(L.s[i].inf.end,3); print(L.s[i].inf.Tstart,4); print(L.s[i].inf.Tend,5); print(L.s[i].inf.name,6); print1(L.s[i].inf.money,7); print1(L.s[i].inf.space,8); printf("\n"); } printf("┕────────────────────────────────────┘\n"); } } void Search_Inf(int f) { bool flag=0; int k; char st[N]; if(f==2){ printf("請輸入起點站:"); scanf("%s",st); } else if(f==3){ printf("請輸入終點站:"); scanf("%s",st); } else if(f==4){ printf("請輸入起飛時間:"); scanf("%s",st); } else { printf("請輸入到達時間:"); scanf("%s",st); } for(int i=1;i<=L.PCnt;i++) { k=0; if(f==2&&strcmp(st,L.s[i].inf.start)==0) k=i; else if(f==3&&strcmp(st,L.s[i].inf.end)==0) k=i; else if(f==4&&strcmp(st,L.s[i].inf.Tstart)==0) k=i; else if(f==5&&strcmp(st,L.s[i].inf.Tend)==0) k=i; if(k){ Dis_Inf(i,1); flag=1; } } if(!flag){printf("沒有該資料\n");} } int Bsearch(int l,int r) { int i=l,j=r; char st[20]; printf("請輸入航班編號(字母大寫):"); scanf("%s",st); while(i<=j){ int mid=(i+j)>>1; if(strcmp(L.s[mid].key,st)==0){ Dis_Inf(mid,1); return mid; } else if(strcmp(L.s[mid].key,st)>0) j=mid-1; else i=mid+1; } printf("沒有符合條件的航班編號\n"); return 0; } void Add_Inf() { int n; int e=++L.PCnt; printf("請輸入新增資料的個數:"); scanf("%d",&n); if(n==0) return; printf("航班號 班期 起點 終點 起飛時間 到達時間 機型 票價 票數\n"); while(n--){ scanf("%s %s",L.s[e].inf.ID,L.s[e].inf.Tdate); scanf("%s %s",L.s[e].inf.start,L.s[e].inf.end); scanf("%s %s %s",L.s[e].inf.Tstart,L.s[e].inf.Tend,L.s[e].inf.name); scanf("%d %d",&L.s[e].inf.money,&L.s[e].inf.space); strcpy(L.s[e].key,L.s[e].inf.ID); e++; L.PCnt=e; } L.PCnt--; Radix_Sort(L); Save(); } void Get_Tiket() { int t,n; if(L.PCnt==0){ printf("還沒有資料\n"); return; } t=Bsearch(1,L.PCnt); if(t){ printf("請輸入訂票的個數:"); scanf("%d",&n); if(n>L.s[t].inf.space){ printf("票額不足:"); } else{ printf("訂票成功\n"); L.s[t].inf.space-=n; } } else printf("沒有該編號\n"); }