数据结构课程设计

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转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
//void DispAdj(ALGraph *G);//输出邻接表G
void 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;
        }
    }
}








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值