1. 程式人生 > >航班資訊檢索與查詢(基數排序)

航班資訊檢索與查詢(基數排序)

花了一週的時間搞資料結構課程設計,現在想起來也不咋樣。

                   航班資訊檢索與查詢系統原始碼
在”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");
}