?? hkdpxt.cpp
字號:
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <ctype.h>
#include <stdlib.h>
#include <malloc.h>
#include <math.h>
#define MAX 100
typedef struct Bookcustomer //創建已訂票客戶信息
{
char name[15];
int number; //已訂票數量
int rank; //艙位等級
struct Bookcustomer *next1;
}Bookcustomer,*Link;
typedef struct Preorder //創建預訂票客戶信息
{
char name[15];
int amount; // 要訂票數量
struct Preorder *next2; //下一個鏈隊結點指針
}Preorder,*Qptr;
typedef struct
{
Qptr front;
Qptr rear;
}linkQueue;
typedef struct Flight{ //創建航線信息
char Flightnum[15]; //航班號
char Planenum[15]; //飛機號
int Flightdata; //飛機周日
int Customernum; //乘員定額
int Freeamount; //余票量
char Addname[15]; //終點站名
struct Flight *next;
struct Bookcustomer *Bookname;//訂票的客戶名單
struct Preorder *Prename; //等候替補的客戶名單
}Flight,*Linklist;
struct Flight *L=NULL;
struct Bookcustomer *H; //為已訂票客戶鏈隊來申請空間
linkQueue Q;
Linklist InitLinklist() //初始化航班信息鏈
{
L=(Linklist)malloc(sizeof(Flight));
if(!L) exit(0);
L->next=NULL; //建立一個帶有頭結點的單鏈表
return (L);
}
int InsertLinklist(Linklist &); //函數聲明不需要&一定加個(變量)標識符
void Input() //錄入功能
{
int j=1,m;
do{
if(!InsertLinklist((Linklist)L)) //向其中加入航班信息
//由于此處用到InsertLinklist()函數所以上面要聲明一下
{
printf("內存已滿\n"); exit(0);
}
printf("\t是否要輸入下一個航線記錄?\n");
printf("\t是請輸入1\n");
printf("\t否請輸入2\n\t");
scanf("%d",&m);
}while(m==1);
}
int InsertLinklist(Linklist &L)//向航線鏈表添加新的結點 引用的用法保證對其操作
{
Linklist p;
p=(Linklist)malloc(sizeof(Flight)); //為一個新的結點分配空間
if(!p) exit(0);
printf("\t請依次輸入以下內容:\n\n");
printf("航班號\n");
getchar();
gets(p->Flightnum);
printf("飛機號\n");
gets(p->Planenum);
printf("終點站\n");
gets(p->Addname);
printf("飛行日期\n");
scanf("%d",&p->Flightdata);
printf("乘員定額\n");
scanf("%d",&p->Customernum);
printf("余票量\n");
scanf("%d",&p->Freeamount);
p->Bookname=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
p->Prename=Q.front=Q.rear=(Qptr)malloc(sizeof(Preorder));
p->next=L->next;
L->next=p; //L只做頭結點不做信息存儲
//這二句是鏈表中的頭插法插入一個結點
return (1);
}
void Search_Flightnum(); //通過航班號查詢
void Search_Addname(); //通過目的地查詢
void Search(); //查詢功能
void Booking(); //訂票功能
void Refund(); //退票功能
void main()
{
H=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
Q.front=Q.rear=(Qptr)malloc(sizeof(Preorder));
InitLinklist();
int n;
do{ //打印主界面
printf("\t 歡迎使用航空客運訂票系統\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 錄入功能 ==\n");
printf("\t==>2. 查詢功能 ==\n");
printf("\t==>3. 訂票功能 ==\n");
printf("\t==>4. 退票功能 ==\n");
printf("\t==>5. 退出 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t請選擇:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1: Input();
break;
case 2: Search();
break;
case 3: Booking();
break;
case 4:Refund();
break;
default :exit(0);//退出
}
}while(n==1||n==2||n==3||n==4);
}
void Search() //查詢功能
{
int n;
printf("\t 查詢航線信息 \n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t==>1. 通過終點站查詢 ==\n");
printf("\t==>2. 通過航班號查詢 ==\n");
printf("\t+++++++++++++++++++++++++++++\n");
printf("\t請選擇:");
scanf("%d",&n);
printf("\n");
switch(n)
{
case 1:Search_Addname();
break;
case 2:Search_Flightnum();
break;
default :break;
}
}
void Search_Addname() //通過終點站查詢
{
char c[15];
int m;
Linklist p=L;
printf("\t請輸入要查詢的終點站:");
gets(c);
gets(c);
do{
p=p->next; //第一次取頭結點后的第一個記錄
if(p) //到最后信息了自然會跳出循環
{
m=strcmpi((*p).Addname,c);
if(m==0)
{
printf("\t航班信息:\n");
printf("\t航班號:%s\n",p->Flightnum);
printf("\t飛機號:%s\n",p->Planenum);
printf("\t飛機周日:周%d\n",p->Flightdata);
printf("\t余票量:%d\n",p->Freeamount);
}
}
else
{
printf("\t對不起,沒有你要找的目的地!\n\n");
m=0;
}
}while(m!=0);
}
void Search_Flightnum() //通過航班號查詢
{
char c[15];
int m;
Linklist p=L;
printf("\t請輸入要查詢的航班號:");
gets(c);
gets(c);
printf("\n");
do{
p=p->next;
if(p)
{
m=strcmpi((*p).Flightnum,c);
if(m==0)
{
printf("\t航班信息:\n");
printf("\t飛機號:%s\n",p->Planenum);
printf("\t飛機周日:周%d\n",p->Flightdata);
printf("\t余票量:%d\n\n",p->Freeamount);
}
}
else
{
printf("\t對不起,沒有你要找的航班號!\n");
m=0;
}
}while(m!=0);
}
void Booking() //訂票功能
{
Linklist p=L; //Linklist類型的L來指向鏈表頭
Bookcustomer *h=H,*h1;
linkQueue q=Q;
char c[15];
int m=1,ticket,number=0,n,rank;
printf("請輸入要定的航班的終點站名:");
gets(c);
gets(c);
printf("\n");
p=L->next;
if(p)
{
do{
if(!p)
{
printf("對不起,沒有您要找的航班:\n\n");
goto loop1;
}
m=strcmpi(p->Addname,c);
if(m==0) //找到此航班輸出其信息
{
printf("航班信息:\n");
printf("航班號:%s\n",p->Flightnum);
printf("飛機號:%s\n",p->Planenum);
printf("飛機周日:周%d\n",p->Flightdata);
printf("余票量:%d\n",p->Freeamount);
}
else
p=p->next;
}while(m!=0);
if(m==0) //找到進行訂票
{
do
{
printf("\n請選擇艙位等級:");
scanf("%d",&rank);
if(rank>3)
printf("\n選擇錯誤,請重新輸入:");
scanf("%d",&rank);
printf("\n請輸入您要訂的票數:");
scanf("%d",&ticket);
if(ticket<=p->Freeamount)
{
h=p->Bookname;
if(h)
{
h1=h;
h=h->next1;
h=(struct Bookcustomer*)malloc(sizeof(Bookcustomer));
printf("請輸入您的姓名:");
gets(h->name);
gets(h->name);
h->number=ticket;
h->next1=h1->next1;
h1->next1=h;
p->Freeamount=p->Freeamount-ticket;
printf("訂票成功:\n"); m=2;
}
}
else
{
printf("余票量:%d\n",p->Freeamount);
printf("對不起,余票 %d 張不足,不能完成訂票\n\n",p->Freeamount);
printf(" 是否要重新訂票?\n");
printf("需要請輸入1 否則請按2 預訂請輸入3 : ");
scanf("%d",&m);
printf("\n");
if(m==3) goto loop3;
}
}while(m==1);
}
}
else
if(!p)
{
loop3: struct Preorder *q3;
printf("對不起,該航班的票已售完\n");
q.front=p->Prename;
if(q.front==q.rear) printf("沒有人預訂票,是否要預訂?\n");
else
if(q.front!=q.rear) printf("已有人預訂票,是否繼續預訂?\n");
printf("預訂請輸入1 否則輸入2 : ");
scanf("%d",&n);
printf("\n");
if(n==1)
{
q3=(Qptr)malloc(sizeof(Preorder));
printf("請輸入您的姓名");
gets(q3->name);
printf("請輸入訂票數");
scanf("%d",&q3->amount);
q3->next2=NULL;
q.rear->next2=q3;
q.rear=q3;
printf(" 你已經預訂了 !\n");
}
}
loop1:;
}
void Refund() //退票功能
{
Linklist p=L;
Bookcustomer *h=H,*h1,*h2;
//linkQueue q=Q;
char c[15],name1[15];
int m=1,ticket,tick;
gets(c);
printf("請輸入航班號:");
gets(c);
p=L;
if(p)
{
do
{ //使用do while來查找是否有此航班
if(!p)
{ //如果是到了表尾且沒有匹配,goto至再輸入航班號
printf("\n對不起,沒有你要找的航班:\n");
goto loop1;
}
m=strcmpi(p->Flightnum,c);//如果匹配的話,m=0
if(m==0)
{
printf("\t航班信息:\n");
printf("航班號:%s\n",p->Flightnum);
printf("飛機號:%s\n",p->Planenum);
printf("飛機周日:周%d\n",p->Flightdata);
printf("余票量:%d\n",p->Freeamount);}
else
p=p->next;
}while(m!=0);
if(m==0)
{ //如果找到了,就來給他退票
do{
h=p->Bookname;
if(h)
{
printf("請輸入您的姓名:");
gets(name1); //gets(name1); 可允許多次退票只要操作合法!
printf("請輸入您已訂的票數:");
scanf("%d",&ticket);
printf("請輸入您要退票的票數:");
scanf("%d",&tick);
printf("\n");
h1=h;
h=h->next1;
if(strcmpi(h->name,name1)==0&&h->number==ticket&&tick<=ticket)
//如果名字和訂的票數相等,則就給他取消訂票
{
p->Freeamount+=tick;
h->number =h->number -tick;
if(tick==ticket)
{
h2=h;
h1->next1=h->next1;
free(h2);
}
printf("您已成功退票!\n\n");
}
else if(strcmpi(h->name,name1)!=0)
{ //如果沒有找到,即系統中沒有該人的信息,提示是否來重新查找
printf("對不起,該航班沒有人訂票或者是你沒有訂該航班的票\n");
printf("是否要重新查找并取消訂票?\n");
printf("需要重新退票請輸入1 否則請按2 ");
scanf("%d",&m);
printf("\n");
}
}
}while(m==1);
}
}
else
{printf("票已售空或是目前沒有航班信息記錄!\n");}
loop1: ;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -