数据结构课程设计
来源:互联网 发布:js面向对象编程例子 编辑:程序博客网 时间:2024/06/07 01:19
main.cpp
/*********************************************************** *版权所有(C)2017 * *文件名称:main.cpp *文件标识:无 *内容摘要:主函数文件*其它说明:无 *当前版本:V1.5 *作者:王万兴 *完成日期:2017,12,22***********************************************************/#include <iostream>#include "win.h"#include "graph.h"#include "clinklist.h"#include "message.h"using namespace std;int main()//主函数,初始化链表和图,进入交互界面函数{ CLinkList *s1,*s2,*s3; MGraph g; seat(s1); seat(s2); seat(s3); airport(g); display(s1,s2,s3,g); return 0;}
各类头文件
graph.h
/************************************************************版权所有(C)2017**文件名称:graph.h*文件标识:无*内容摘要:图算法库头文件*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#ifndef GRAPH_H_INCLUDED#define GRAPH_H_INCLUDED#include <iostream>#include "stdio.h"#define MAXV 100 //最大顶点个数#define INF 32767 //INF表示∞typedef int InfoType;//以下定义邻接矩阵类型typedef struct{ std::string no,city; //顶点编号 InfoType info; //顶点其他信息,在此存放带权图权值} airplane; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵 int n,e; //顶点数,弧数 airplane plane[MAXV]; //存放顶点信息} MGraph; //图的邻接矩阵类型//以下定义邻接表类型typedef struct ANode //弧的结点结构类型{ int adjvex; //该弧的终点位置 struct ANode *nextarc; //指向下一条弧的指针 InfoType info; //该弧的相关信息,这里用于存放权值} ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{ Vertex data; //顶点信息 int count; //存放顶点入度,只在拓扑排序中用 ArcNode *firstarc; //指向第一条弧} VNode;typedef VNode AdjList[MAXV]; //AdjList是邻接表类型typedef struct{ AdjList adjlist; //邻接表 int n,e; //图中顶点数n和边数e} ALGraph; //图的邻接表类型//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)// n - 矩阵的阶数// g - 要构造出来的邻接矩阵数据结构void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵//void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表//void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G//void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵gvoid DispMat(MGraph g);//输出邻接矩阵g//void DispAdj(ALGraph *G);//输出邻接表Gvoid Ppath(int path[],int i,int v);void Dispath(int dist[],int path[],int s[],int n,int v);void Floyd(MGraph g,int b);#endif // GRAPH_H_INCLUDED
win.h
/************************************************************版权所有(C)2017**文件名称:win.h*文件标识:无*内容摘要:win窗口头文件*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#ifndef WIN_H_INCLUDED#define WIN_H_INCLUDED#include "clinklist.h"#include "graph.h"void display(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b);void display2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int id);void display3(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);#endif // WIN_H_INCLUDED
message.h
/************************************************************版权所有(C)2017**文件名称:message.h*文件标识:无*内容摘要:message头文件*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#ifndef MESSAGE_H_INCLUDED#define MESSAGE_H_INCLUDED#include "clinklist.h"#include "graph.h"void seat(CLinkList *&seat);void airport(MGraph &g);void buy_tickets(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b);void change_tick(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g);#endif // MESSAGE_H_INCLUDEDclinklist.h
/************************************************************版权所有(C)2017**文件名称:clinklist.h*文件标识:无*内容摘要:链表算法库头文件*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#ifndef CLINKLIST_H_INCLUDED#define CLINKLIST_H_INCLUDED#include <string>//循环单链表基本运算函数typedef struct LNode //定义单链表结点类型{ int seat; std::string person; int ID[10]; struct LNode *next;} CLinkList;void CreateListF(CLinkList *&L,int a,std::string b,int c);//头插法建立循环单链表void CreateListR(CLinkList *&L,int a,std::string b,int c);//尾插法建立循环单链表void InitList(CLinkList *&L); //初始化链表void DestroyList(CLinkList *&L); //销毁链表bool ListEmpty(CLinkList *L); //判断链表是否为空int ListLength(CLinkList *L); //求链表长度void DispList(CLinkList *L); //输出链表bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g); //取链表元素int LocateElem(CLinkList *L,int &e); //查找元素bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l); //插入节点bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g); //删除节点void delet(CLinkList *&L,int &g); //删除节点#endif // CLINKLIST_H_INCLUDED
各类函数文件
win.cpp
/************************************************************版权所有(C)2017**文件名称:win.cpp*文件标识:无*内容摘要:窗口函数文件*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#include <iostream>#include "win.h"#include "message.h"#include <stdio.h>#include <iomanip>#include <fstream>#include <string>#include <string.h>#include <conio.h>#include <malloc.h>using namespace std;/************************************* 功能描述:功能选择输入判断* 输入参数:选择a* 输出参数:无* 备注信息:无*************************************/template<class T>//模板T fun(T x){ if(x!=2) throw x; else return x;}/************************************* 功能描述:主界面1* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:* 备注信息:界面,提供功能选项*************************************/void display(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){ system("cls"); cout<<endl; cout<<" ** ** ********* ** ** *** "<<endl; cout<<" ** ** ********* ** ** ** ** "<<endl; cout<<" ** ** ** ** ** ** ** "<<endl; cout<<" ** ** ** ** ** ** ** "<<endl; cout<<" ********* ********* ** ** ** ** "<<endl; cout<<" ********* ********* ** ** ** ** "<<endl; cout<<" ** ** ** ** ** ** ** "<<endl; cout<<" ** ** ** ** ** ** ** "<<endl; cout<<" ** ** ********* ********* ********* ** ** "<<endl; cout<<" ** ** ********* ********* ********* *** "<<endl; cout<<endl; cout<<" **************************************"<<endl; cout<<" * *"<<endl; cout<<" * 欢迎进入航班信息查询及购票系统 *"<<endl; cout<<" * *"<<endl; cout<<" **************************************"<<endl; cout<<endl<<endl; cout<<" 1 查询航班"<<endl<<endl; cout<<" 2 查询已购"<<endl<<endl; cout<<" 3 购票"<<endl<<endl; cout<<" 4 改签"<<endl<<endl; cout<<" 5 退票"<<endl<<endl; cout<<" 6 退出"<<endl<<endl; int a=0; cout<<" 请输入数字:"; cin>>a; while(a<1||a>5) { try { fun(a); } catch(...) { cout<<" 输入错误,请重新输入:"; } cin>>a; } switch(a) { case 1: display3(L1,L2,L3,g); break; case 2:chaxun(L1,L2,L3,g); break; case 3:buy_tickets(L1,L2,L3,g); break; case 4: change_tick(L1,L2,L3,g); break; case 5:tuipiao(L1,L2,L3,g); break; case 6: exit(0); }}/************************************* 功能描述:购票界面* 输入参数:三个链表头指针L1,L2,L3,图g,目的地id* 输出参数:无* 备注信息:购票界面,转购票函数,*************************************/void display2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int id){ cout<<" **************************************"<<endl; cout<<" * *"<<endl; cout<<" * 欢迎进入购票系统 *"<<endl; cout<<" * *"<<endl; cout<<" **************************************"<<endl; cout<<endl<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<" 请选择目的地"<<endl; cout<<" 1上海 2杭州 3海南 4武汉"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cin>>id; while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } if(id<1 || id>4) { cout<<" 目的地无法到达,请重新输入"<<endl; cin>>id; } else { switch(id) { case 1: case 2: break; case 3: case 4: cout<<" 无法直达,需换乘"<<endl; check(L1,L2,L3,g,id); break; } }}/************************************* 功能描述:查询界面* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:无* 备注信息:转查询函数*************************************/void display3(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){ int id; cout<<" **************************************"<<endl; cout<<" * *"<<endl; cout<<" * 欢迎进入查询系统 *"<<endl; cout<<" * *"<<endl; cout<<" **************************************"<<endl; cout<<endl<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<" 请选择目的地"<<endl; cout<<" 1上海 2杭州 3海南 4武汉"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cin>>id; while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } if(id<1 || id>4) { cout<<" 目的地无法到达,请重新输入"<<endl; cin>>id; } else { switch(id) { case 1: case 2: buy_tickets(L1,L2,L3,g); break; case 3: case 4: cout<<" 无法直达,需换乘"<<endl; check(L1,L2,L3,g,id); break; } }}graph.cpp
/************************************************************版权所有(C)2017**文件名称:graph.cpp*文件标识:无*内容摘要:图算法库,建立图用*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#include <stdio.h>#include <malloc.h>#include "graph.h"#include <iomanip>#include <iostream>#include <fstream>#include <string>#include <stdlib.h>#include <string.h>#include <conio.h>using namespace std;//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)// n - 矩阵的阶数// g - 要构造出来的邻接矩阵数据结构void ArrayToMat(int *Arr, int n, MGraph &g){ int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 g.n=n; for (i=0; i<g.n; i++) { for (j=0; j<g.n; j++) { g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用 if(g.edges[i][j]!=0 && g.edges[i][j]!=INF) count++; } } g.e=count;}void ArrayToList(int *Arr, int n, ALGraph *&G){ int i,j,count=0; //count用于统计边数,即矩阵中非0元素个数 ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); G->n=n; for (i=0; i<n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc=NULL; for (i=0; i<n; i++) //检查邻接矩阵中每个元素 for (j=n-1; j>=0; j--) if (Arr[i*n+j]!=0) //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j] { p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex=j; p->info=Arr[i*n+j]; p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc=p; } G->e=count;}void MatToList(MGraph g, ALGraph *&G)//将邻接矩阵g转换成邻接表G{ int i,j; ArcNode *p; G=(ALGraph *)malloc(sizeof(ALGraph)); for (i=0; i<g.n; i++) //给邻接表中所有头节点的指针域置初值 G->adjlist[i].firstarc=NULL; for (i=0; i<g.n; i++) //检查邻接矩阵中每个元素 for (j=g.n-1; j>=0; j--) if (g.edges[i][j]!=0) //存在一条边 { p=(ArcNode *)malloc(sizeof(ArcNode)); //创建一个节点*p p->adjvex=j; p->info=g.edges[i][j]; p->nextarc=G->adjlist[i].firstarc; //采用头插法插入*p G->adjlist[i].firstarc=p; } G->n=g.n; G->e=g.e;}void ListToMat(ALGraph *G,MGraph &g)//将邻接表G转换成邻接矩阵g{ int i,j; ArcNode *p; g.n=G->n; //根据一楼同学“举报”改的。g.n未赋值,下面的初始化不起作用 g.e=G->e; for (i=0; i<g.n; i++) //先初始化邻接矩阵 for (j=0; j<g.n; j++) g.edges[i][j]=0; for (i=0; i<G->n; i++) //根据邻接表,为邻接矩阵赋值 { p=G->adjlist[i].firstarc; while (p!=NULL) { g.edges[i][p->adjvex]=p->info; p=p->nextarc; } }}void Ppath(int path[][MAXV],int i,int j) //前向递归查找路径上的顶点{ int k; k=path[i][j]; if (k==-1) return; //找到了起点则返回 Ppath(path,i,k); //找顶点i的前一个顶点k printf("%d,",k); Ppath(path,k,j); //找顶点k的前一个顶点j}void Dispath(int A[][MAXV],int path[][MAXV],int n){ int i,j; for (i=0; i<n; i++) for (j=0; j<n ; j++) { if (A[i][j]==INF) { if (i!=j) printf("从%d到%d没有路径\n",i,j); } else { printf(" 从%d到%d=>路径长度:%d 路径:",i,j,A[i][j]); printf("%d,",i); //输出路径上的起点 Ppath(path,i,j); //输出路径上的中间点 printf("%d\n",j); //输出路径上的终点 } }}void Floyd(MGraph g,int b){ int A[MAXV][MAXV],path[MAXV][MAXV]; int i,j,k; for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) { A[i][j]=g.edges[i][j]; path[i][j]=-1; } for (k=0; k<g.n; k++) { for (i=0; i<g.n; i++) for (j=0; j<g.n; j++) if (A[i][j]>A[i][k]+A[k][j]) { A[i][j]=A[i][k]+A[k][j]; path[i][j]=k; } } int apath[MAXV],d; if(A[0][b]<INF&&b!=0) { cout<<"\n*从烟台"<<" 到 "<<g.plane[b].city<<" 的最短路径为:"; k=path[0][b]; d=0; apath[d]=b; while(k!=-1&&k!=0) { d++; apath[d]=k; k=path[0][k]; } d++; apath[d]=0; //cout<<1; //cout<<2; for(int s=d-1;s>=0;s--) { cout<<" --> "<<g.plane[apath[s]].city; // cout<<','<<apath[s]; } cout<<" ,最短时间为:"<<A[0][b]<<"小时"<<endl; } else if(0==b) cout<<"\n*目的地输入不合法!\n"; else cout<<"\n*不能到达该目的地\n";}void DispAdj(ALGraph *G)//输出邻接表G{ int i; ArcNode *p; for (i=0; i<G->n; i++) { p=G->adjlist[i].firstarc; printf("%3d: ",i); while (p!=NULL) { printf("-->%d/%d ",p->adjvex,p->info); p=p->nextarc; } printf("\n"); }}
clinklist.h
/************************************************************版权所有(C)2017**文件名称:message.cpp*文件标识:无*内容摘要:,链表算法库,建立链表用*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************///循环单链表基本运算函数#include <stdio.h>#include <malloc.h>#include <iostream>#include "clinklist.h"using namespace std;void CreateListF(CLinkList *&L,int a,std::string b,int c)//头插法建立循环单链表{ CLinkList *s; L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=NULL; //for (i=0; i<n; i++) { s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点 s->seat=a; s->person=b; s->ID[0]=c; s->next=L->next; //将*s插在原开始结点之前,头结点之后 L->next=s; } s=L->next; while (s->next!=NULL) //查找尾结点,由s指向它 s=s->next; s->next=L; //尾结点next域指向头结点}void CreateListR(CLinkList *&L,int a,std::string b,int c)//尾插法建立循环单链表{ CLinkList *s,*r; L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点 //for (i=0; i<n; i++) { s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点 s->seat=a; s->person=b; s->ID[0]=c; r->next=s; //将*s插入*r之后 r=s; } r->next=L; //尾结点next域指向头结点}void InitList(CLinkList *&L) //初始化链表{ L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点 L->next=L;}void DestroyList(CLinkList *&L) //销毁链表{ CLinkList *p=L,*q=p->next; while (q!=L) { free(p); p=q; q=p->next; } free(p);}bool ListEmpty(CLinkList *L) //判断链表是否为空{ return(L->next==L);}int ListLength(CLinkList *L) //求链表长度{ CLinkList *p=L; int i=0; while (p->next!=L) { i++; p=p->next; } return(i);}void DispList(CLinkList *L) //输出链表{ CLinkList *p=L->next; while (p!=L) { printf("%d ",p->seat); //printf("%s ",p->person); cout<<p->person; printf(" %d ",p->ID[0]); p=p->next; } printf("\n");}bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g) //取链表元素{ int j=0; CLinkList *p; if (L->next!=L) //单链表不为空表时 { if (i==1) { e=L->next->seat; f=L->next->person; g=L->next->ID[0]; return true; } else //i不为1时 { p=L->next; while (j<i-1 && p!=L) { j++; p=p->next; } if (p==L) return false; else { e=L->next->seat; f=L->next->person; g=L->next->ID[0]; return true; } } } else //单链表为空表时 return false;}int LocateElem(CLinkList *L,int &e) //查找元素{ CLinkList *p=L->next; int n=1; while (p!=L && p->ID[0]!=e) { p=p->next; n++; } if (p==L) return(0); else return(n);}bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l) //插入节点{ int j=0; CLinkList *p=L,*s; if (p->next==L || i==1) //原单链表为空表或i==1时 { s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s s->seat=l; s->person=f; s->ID[0]=g; s->next=p->next; //将*s插入到*p之后 p->next=s; return true; } else { p=L->next; while (j<i-2 && p!=L) { j++; p=p->next; } if (p==L) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { s=(CLinkList *)malloc(sizeof(CLinkList)); //创建新结点*s s->seat=l; s->person=f; s->ID[0]=g; s->next=p->next; //将*s插入到*p之后 p->next=s; return true; } }}bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g) //删除节点{ int j=0; CLinkList *p=L,*q; if (p->next!=L) //原单链表不为空表时 { if (i==1) //i==1时 { q=L->next; //删除第1个结点 L->seat=e; L->person=f; L->ID[0]=g; L->next=q->next; free(q); return true; } else //i不为1时 { p=L->next; while (j<i-2 && p!=L) { j++; p=p->next; } if (p==L) //未找到第i-1个结点 return false; else //找到第i-1个结点*p { q=p->next; //q指向要删除的结点 e=q->seat; f=q->person; g=q->ID[0]; p->next=q->next; //从单链表中删除*q结点 free(q); //释放*q结点 return true; } } } else return 0;}void delet(CLinkList *&L,int &g)//退票功能{ CLinkList *p=L->next,*q=L; while (p!=L && p->ID[0]!=g) { q=p; p=p->next; } q->next=p->next; //从单链表中删除p结点 free(p);}
check.h
/************************************************************版权所有(C)2017**文件名称:check.cpp*文件标识:无*内容摘要:查询路径*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#include <iostream>#include "win.h"#include "graph.h"#include <stdio.h>#include <iomanip>#include <fstream>#include <string>#include <string.h>#include <conio.h>#include "message.h"#include "windows.h"using namespace std;/************************************* 功能描述:查询路径* 输入参数:三个链表头指针L1,L2,L3,图g,目的地b* 输出参数:无* 备注信息:查询最短路径和时间,转入购票*************************************/void check(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g,int b){ cout<<" 正在寻找最快换乘方案..."<<endl; Sleep(2000); cout<<" 已找到最快换乘方案!"<<endl; Floyd(g,b); cout<<" 是否购票?(y/n)"<<endl<<" "; char a; while(1) { cin>>a; if (a=='y'||a=='Y') buy_tickets(L1,L2,L3,g); else if (a=='n'||a=='N') display(L1,L2,L3,g); else cout<<" 请重新输入"<<endl<<" "; continue; }}
/************************************************************版权所有(C)2017**文件名称:message.cpp*文件标识:无*内容摘要:存储结构初始化,订票,改签,退票,查询*其它说明:无*当前版本:V1.5*作者:王万兴*完成日期:2017,12,22***********************************************************/#include "clinklist.h"#include "win.h"#include "graph.h"#include "stdio.h"#include "message.h"#include <malloc.h>#include <iomanip>#include <iostream>#include <fstream>#include <string>#include <cstring>#include <stdlib.h>#include <string.h>#include <conio.h>#include <windows.h>using namespace std;/************************************* 功能描述:链表初始化* 输入参数:链表头指针* 输出参数:无* 备注信息:尾插法创建链表*************************************/void seat(CLinkList *&seat){ int a=0,c=0; string b; InitList(seat); CreateListR(seat,a,b,c); //ElemType a2; // string a1; //ifstream infile("plane.txt",ios::binary); // while(infile.good()) //{ // infile>>a1>>a2;//addElem(seat,a1,a2); //}}/************************************* 功能描述:图初始化* 输入参数:图g* 输出参数:无* 备注信息:关系矩阵*************************************/void airport(MGraph &g){ int i; int a[5][5]={ {0,2,3,INF,INF}, {INF,0,2,5,INF}, {INF,INF,0,3,1}, {INF,INF,INF,0,2}, {INF,INF,INF,INF,0} }; ArrayToMat(a[0], 5, g); ifstream infile("plane.txt",ios::binary); while(infile.good()) { infile>>g.plane[i].city; i++; } infile.close();}/************************************* 功能描述:购票* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:无* 备注信息:输入对错判断,乘客信息录入链表,转入查询*************************************/void buy_tickets(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){ int id,l1,l2,l3; cout<<" **************************************"<<endl; cout<<" * *"<<endl; cout<<" * 欢迎进入购票系统 *"<<endl; cout<<" * *"<<endl; cout<<" **************************************"<<endl; cout<<endl<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<" 请选择目的地"<<endl; cout<<" 1上海 2杭州 3海南 4武汉"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cin>>id; while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } while(1) { if(id<1 || id>4) { cout<<" 目的地无法到达,请重新输入"<<endl; cin>>id; } else { switch(id) { case 1: case 2: break; case 3: case 4: cout<<" 无法直达,需换乘"<<endl; check(L1,L2,L3,g,id); break; } break; } }int k; int z; string y; cout<<" 请填写以下信息 "<<endl; cout<<" 姓名 身份证号 "<<endl<<" "; cin>>y>>z; if(id==1) { CLinkList *p=L1; while (p->next!=L1) { p=p->next; } if(p->seat==3) { cout<<" 本次航班座位已售完,请改乘其他航班"<<endl; buy_tickets(L1,L2,L3,g); } else { l1=ListLength(L1); ListInsert(L1,l1,id,y,z,l1); p->seat=p->seat+1; } } else if(id==2) { CLinkList *q=L2; while (q->next!=L2) { q=q->next; } if(q->seat==3) { cout<<" 本次航班座位已售完,请改乘其他航班"<<endl; buy_tickets(L1,L2,L3,g); } else { l2=ListLength(L2); ListInsert(L2,l2,id,y,z,l2); q->seat=q->seat+1; } } else if(id==3) { CLinkList *s=L3; while (s->next!=L3) { s=s->next; } if(s->seat==3) { cout<<" 本次航班座位已售完,请改乘其他航班"<<endl; buy_tickets(L1,L2,L3,g); } else { l3=ListLength(L3); ListInsert(L3,l3,id,y,z,l3); s->seat=s->seat+1; } } //system("cls");//清屏 string hb,cd; if (id==1) {hb="c1231";cd="烟台—上海";} else if (id==2) {hb="a1453";cd="烟台—杭州";} else if (id==3) {hb="b1356";cd="杭州—海南";} cout<<" \n"; cout<<" \n"; cout<<" \n"; cout<<"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"; cout<<"┃ ┃\n"; cout<<"┃ XX航空公司 ┃\n"; cout<<"┃ 航班 姓名 身份证号 目的地 ┃\n"; cout<<"┃ ┃\n"; cout<<"┃ "<<hb<<" "<<y<<" "<<z<<" "<<cd<<" ┃\n"; cout<<"┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"; cout<<" \n"; cout<<" 继续购票请按1 返回主菜单请按0 \n"; cin>>k; if(k==1) { buy_tickets(L1,L2,L3,g);//继续买票 } else if (k==0) { display(L1,L2,L3,g); }//B[id].type=1; }/************************************* 功能描述:链表内查询* 输入参数:链表头指针L,乘客ID e* 输出参数:返回1或0* 备注信息:*************************************/int chaxun2(CLinkList *&L,int &e){ CLinkList *p=L->next; int n=1; while (p!=L && p->ID[0]!=e) { p=p->next; n++; } if(p->ID[0]==e) { cout<<" "<<p->person<<" "<<e; return 1; } else return 0;}/************************************* 功能描述:改签* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:无* 备注信息:包含退票和转入购票功能*************************************/void change_tick(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){ int id,a,b,c,d; string y; //CLinkList *L; //InitList(L); cout<<" 请填写以下信息 "<<endl; cout<<" 姓名 身份证号 "<<endl<<" "; //scanf("%d %s %d",&x,y,&z); cin>>y>>id; while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>y>>id; } b=chaxun2(L1,id); c=chaxun2(L2,id); d=chaxun2(L3,id); if((b+c+d)==0) { cout<<" 未查询到关于您的订票信息"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000); display(L1,L2,L3,g); } cout<<" 选择要换退的航班号:"<<endl; cout<<" 1.c1231 2.a1453 3.b1356"<<endl; cin>>a; if(a<1 || a>3) { cout<<"航班不存在,请重新输入"<<endl; cin>>a; } while(!cin) { cout<<"输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } switch(a) { case 1: { delet(L1,id);//删除 } break; case 2: { delet(L2,id);//删除 } break; case 3: { delet(L3,id);//删除 } break; } buy_tickets(L1,L2,L3,g);}/************************************ 功能描述:查询购票* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:无* 备注信息:根据乘客ID查询是否购票*************************************/void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){int id,b=0,c=0,d=0;//b=0作为while循环的条件cout<<" 请输入您的身份证号"<<endl<<" "; cin>>id; while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } cout<<" 姓名 身份证号 航班"<<endl<<" "; b=chaxun2(L1,id); if(b==1) { cout<<" c1231"<<endl; } c=chaxun2(L2,id); if(c==1) { cout<<" a1453"<<endl; } d=chaxun2(L3,id); if(d==1) { cout<<" b1356"<<endl; } if((b+c+d)==0) { cout<<" 未查询到关于您的订票信息"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒 display(L1,L2,L3,g); } else { cout<<" 查询完成 "<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒 display(L1,L2,L3,g); }}/************************************* 功能描述:退票* 输入参数:三个链表头指针L1,L2,L3,图g* 输出参数:无* 备注信息:删除节点,判断输入*************************************/void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3,MGraph &g){int id,a,b;string name;cout<<" 请输入您的身份证号、退订的航班号和姓名"<<endl; cin>>id>>a>>name; if(a<1 || a>3) { cout<<" 航号不存在,请重新输入"<<endl; cin>>a; } while(!cin) { cout<<" 输入错误,请重新输入:"<<endl; cin.sync(); cin.clear(); cin>>id; } switch(a) { case 1: { b=chaxun2(L1,id); if(b==0) { cout<<" 未查询到关于您的订票信息"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒 display(L1,L2,L3,g); } else { delet(L1,id);//删除 cout<<" 已成功将您的订票删除"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒 display(L1,L2,L3,g); } break; } case 2: { b=chaxun2(L2,id); if(b==0) { cout<<" 未查询到关于您的订票信息"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒 display(L1,L2,L3,g); } else { delet(L2,id);//删除 cout<<" 已成功将您的订票删除"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000); display(L1,L2,L3,g); } break; } case 3: { b=chaxun2(L3,id); if(b==0) { cout<<" 未查询到关于您的订票信息"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000); display(L1,L2,L3,g); } else { delet(L3,id);//删除 cout<<" 已成功将您的订票删除"<<endl; cout<<" 即将返回到主菜单 "<<endl; Sleep(2000); display(L1,L2,L3,g); } break; } }}
阅读全文
0 0
- 数据结构课程设计
- 数据结构课程设计
- 课程设计----数据结构
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 《数据结构》课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构课程设计
- 数据结构 课程设计
- 【分布式】Zookeeper使用--开源客户端
- zookeeper windows x64 环境搭建
- linux查找文件夹命令
- 使用Redis实现分布式锁的原理
- XML 注意事项
- 数据结构课程设计
- 排序概念与插入类排序
- 日本主要二手车集团及其经销商接受比特币支付
- SEC暂停一加密货币公司证券交易
- 研究发现2018年三分之一的千禧世代将购买加密货币
- 记录一些自己常用的linux上的命令
- HashMap的工作原理
- 爱沙尼亚推动发行“国家数字货币”进程
- Django: 设置'unique_together'不起作用