数据结构课程设计

来源:互联网 发布: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_INCLUDED
clinklist.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;    }}


message.h

/************************************************************版权所有(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;        }    }}








原创粉丝点击