数据结构课程设计——飞机订票系统
2017-12-22 09:56
393 查看
/*
*Copyright(c)2017,烟台大学计算机学院
*All right reserved.
*项目名:SK
*作者:盛凯
*完成日期:2017年12月22日
*版本号:v1.5
*
*问题描述:模拟航空订票业务,设计一个可以提供各种航班信息查询和服务的飞机订票系统。
*
main.cpp:
/***********************************************************
*版权所有(C)2017,S
1fb17
hengkai
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:该文件用于存放主函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string>
#include <iostream>
#include "linlist.h"
#include "function.h"
#include "graph.h"
using namespace std;
int main()
{
CLinkList *L1; // 初始化航班1
InitList(L1);
CreateListR(L1,0,"烟台至北京",200);//航班的票数地点价格
CLinkList *L2; // 初始化航班2
InitList(L2);
CreateListR(L2,0,"烟台至上海",500);
CLinkList *L3; // 初始化航班3
InitList(L3);
CreateListR(L3,0,"烟台至乌鲁木齐",900);
show2(L1,L2,L3);
return 0;
}
function.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:function.cpp
*文件标识:无
*内容摘要:该文件用于执行主页面下的功能函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include "linlist.h"
#include "function.h"
#include <fstream> //输出文件流
#include <windows.h>//用到休眠函数
#include "graph.h"
using namespace std;
/***********************************************************
*功能描述:显示主界面下的欢迎界面
*输入参数:无
*输出参数:无
*返回值:无
************************************************************/
void show3()
{
system("color 8f");
cout<<endl<<endl;
cout<<"** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * "<<endl;
cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl;
cout<<" ** ** ** ** * * * * * * * * * * "<<endl;
cout<<" *** *** * * * * * * * * * * "<<endl;
cout<<" * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 飞机订票系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.订票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.景点 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.订单查询 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃4.所有乘客信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃5.改签 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃6.退票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃7.显示航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
}
/***********************************************************
*功能描述:显示主界面
*输入参数:单链表L1、L2、L3,选择choice
*输出参数:无
*返回值:无
************************************************************/
void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int choice=10;
while(choice!=0)
{
show3();
cin >> choice;
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>choice;
}
switch(choice)
{
case 1:
{
system("cls");
yuding(L1,L2,L3);
choice=0;
break;
}
case 2:
{
system("cls");
road1(L1,L2,L3);
choice=0;
break;
}
case 3:
{
system("cls");
chaxun(L1,L2,L3);
choice=0;
break;
}
case 4:
{
system("cls");
searchall(L1,L2,L3);
choice=0;
break;
}
case 5:
{
system("cls");
gaiqian(L1,L2,L3);
choice=0;
break;
}
case 6:
{
system("cls");
tuipiao(L1,L2,L3);
choice=0;
break;
}
case 7:
{
system("cls");
xianshi(L1,L2,L3);
choice=0;
break;
}
case 0:
{
exit(0);
break;
}
}
}
}
/***********************************************************
*功能描述:预定机票模块
*输入参数:单链表L1、L2、L3、预定的航班号id、姓名y、身份证号z
*输出参数:无
*返回值:无
************************************************************/
void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int id,k,l1,l2,l3;
cout<<"请输入您要预订的航班号"<<endl;
cin>>id;
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
if(id<1 || id>3)
{
cout<<"航号不存在,请重新输入"<<endl;
cin>>id;
}
else
{
{
int z;
std::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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
else
{
l3=ListLength(L3);
ListInsert(L3,l3,id,y,z,l3);
s->seat=s->seat+1;
}
}
system("cls");//清屏
cout<<" \n";
cout<<" \n";
cout<<" \n";
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
cout<<" \n";
cout<<" 订票成功 \n";
cout<<" \n";
cout<<" 座位号 姓名 身份证号 \n";
cout<<" \n";
if(id==1)
cout<<" "<<l1<<" "<<y<<" "<<z<<" \n";
else if(id==2)
cout<<" "<<l2<<" "<<y<<" "<<z<<" \n";
else if(id==3)
cout<<" "<<l3<<" "<<y<<" "<<z<<" \n";
cout<<" \n";
cout<<" \n";
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
cout<<" \n";
cout<<" 继续购票请按1 返回主菜单请按0 \n";
cin>>k;
if(k==1)
{
yuding(L1,L2,L3);//继续买票
}
else if (k==0)
{
show2(L1,L2,L3);
}
}
}
}
/***********************************************************
*功能描述:查询机票模块
*输入参数:单链表L1、L2、L3、身份证号id
*输出参数:无
*返回值:无
************************************************************/
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
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;
}
b=chaxun2(L1,id);
c=chaxun2(L2,id);
d=chaxun2(L3,id);
if((b+c+d)==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
cout<<" 查询完成 "<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
}
/***********************************************************
*功能描述:查询机票模块的子模块
*输入参数:单链表L 预定的航班号id
*输出参数:座号、姓名、身份证号
*返回值:成功返回0,不成功返回1
************************************************************/
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<<"------------------------------------------------------------------"<<endl;
cout<<endl;
cout<<"座号 姓名 身份证 "<<endl<<endl;
cout<<p->seat<<" "<<p->person<<" "<<e<<endl;
cout<<endl;
cout<<"------------------------------------------------------------------"<<endl;
return 1;
}
else
return 0;
}
/***********************************************************
*功能描述:打印乘客信息到文件模块
*输入参数:单链表L1、L2、L3、
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
fstream txtfile;
txtfile.open( "旅客信息.txt", ios::out ); //打开文件
txtfile<<" 旅客信息 "<<endl<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<" 航班号 座位号 姓名 身份证号 "<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
txtfile<<" 1号航班: "<<p->seat<<" "<<p->person<<" "<<p->ID[0]<<endl;
p=p->next;
}
CLinkList *q=L2->next;
while (q->next!=L2)
{
txtfile<<" 2号航班: "<<q->seat<<" "<<q->person<<" "<<q->ID[0]<<endl;
q=q->next;
}
CLinkList *r=L3->next;
while (r->next!=L3)
{
txtfile<<" 3号航班: "<<r->seat<<" "<<r->person<<" "<<r->ID[0]<<endl;
r=r->next;
}
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<" 感谢您的信任 祝您旅途愉快 "<<endl<<endl;//跳格,横向跳到下一制表位
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile.close();
}
/***********************************************************
*功能描述:查询所有乘客信息模块
*输入参数:单链表L1、L2、L3、管理员密码passwd
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
char t;//状态字
int passwd=1997,k;
cout<<"请输入管理员密码"<<endl;
cin>>k;
if(k==passwd)
{
cout<<" 航班号 座号 姓名 身份证号"<<endl;
cout<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
cout<<" 1号航班: "<<p->seat<<" "<<p->person<<" "<<p->ID[0]<<endl;
p=p->next;
}
CLinkList *q=L2->next;
while (q->next!=L2)
{
cout<<" 2号航班: "<<q->seat<<" "<<q->person<<" "<<q->ID[0]<<endl;
q=q->next;
}
CLinkList *r=L3->next;
while (r->next!=L3)
{
cout<<" 3号航班: "<<r->seat<<" "<<r->person<<" "<<r->ID[0]<<endl;
r=r->next;
}
cout<<endl;
cout<<"是否打印所有旅客信息?"<<endl;
cin>>t;
if(t=='Y' || t=='y')
{
dayin(L1,L2,L3);
cout<<" 旅客信息打印成功!"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
else
{
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
}
else
{
cout<<"密码错误!"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
}
/***********************************************************
*功能描述:退票模块
*输入参数:单链表L1、L2、L3、航班号a
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
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下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *p=L1;
while (p->next!=L1)
{
p=p->next;
}
p->seat=p->seat-1;
delet(L1,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
case 2:
{
b=chaxun2(L2,id);
if(b==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *q=L2;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1;
delet(L2,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
case 3:
{
b=chaxun2(L3,id);
if(b==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *s=L3;
while (s->next!=L3)
{
s=s->next;
}
s->seat=s->seat-1;
delet(L3,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
}
}
/***********************************************************
*功能描述:退票模块下的一个子模块
*输入参数:单链表L、身份证号g
*输出参数:无
*返回值:无
************************************************************/
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);
}
/***********************************************************
*功能描述:显示所有航班信息模块
*输入参数:单链表L1、L2、L3
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//显示航班信息
{
cout<<" 航班信息查询 "<<endl;
cout<<" "<<endl;
cout<<" 剩余票数 航线 票价 "<<endl;
cout<<" "<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
p=p->next;
}
cout<<"1号航班: "<<2-(p->seat)<<" "<<p->person<<" "<<p->ID[0]<<endl;
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
cout<<"2号航班: "<<2-(q->seat)<<" "<<q->person<<" "<<q->ID[0]<<endl;
CLinkList *r=L3->next;
while (r->next!=L3)
{
r=r->next;
}
cout<<"3号航班: "<<2-(r->seat)<<" "<<r->person<<" "<<r->ID[0]<<endl;
cout<<"即将返回主菜单"<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
/***********************************************************
*功能描述:改签模块
*输入参数:单链表L1、L2、L3、原航班号a、改签航班号e、姓名y、身份证号id
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int id,a,b,c,d,e,l1,l2,l3;//id为身份证号,b、c、d用来放返回值,a为原航班号,e为改签航班号
std::string y;//姓名
cout<<" 请填写以下信息 "<<endl;
cout<<" 姓名 身份证号 "<<endl;
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);
show2(L1,L2,L3);
}
else
{
cout<<"请输入您的航班号和您要改签的航班号"<<endl;
cin>>a>>e;
if(a<1 || a>3 || e<1 || e>3)
{
cout<<"航号不存在,请重新输入"<<endl;
cin>>a>>e;
}
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>a>>e;
}
switch(e)
{
case 1:
{
CLinkList *p=L1->next;
while (p->next!=L1)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
delet(L2,id);//删除原航班机票
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L1);//购买新机票
ListInsert(L1,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
delet(L3,id);//删除原航班机票
CLinkList *q=L3->next;
while (q->next!=L3)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L1);//购买新机票
ListInsert(L1,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
case 2:
{
CLinkList *p=L2->next;
while (p->next!=L2)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
delet(L1,id);//删除原航班机票
CLinkList *q=L1->next;
while (q->next!=L1)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L2);//购买新机票
ListInsert(L2,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
delet(L3,id);//删除原航班机票
CLinkList *q=L3->next;
while (q->next!=L3)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L2);//购买新机票
ListInsert(L2,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
case 3:
{
CLinkList *p=L3->next;
while (p->next!=L3)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
delet(L1,id);//删除原航班机票
CLinkList *q=L1->next;
while (q->next!=L1)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L3);//购买新机票
ListInsert(L3,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
delet(L2,id);//删除原航班机票
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L3);//购买新机票
ListInsert(L3,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
}
}
}
linlist.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:linlist.cpp
*文件标识:无
*内容摘要:该文件用于执行有关链表功能的函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
//循环单链表基本运算函数
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include "linlist.h"
using namespace std;
/***********************************************************
*功能描述:头插法
*输入参数:单链表L、机票数a、始发地和目的地b、票价c
*输出参数:无
*返回值:无
************************************************************/
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域指向头结点
}
/***********************************************************
*功能描述:尾插法
*输入参数:单链表L、机票数a、始发地和目的地b、票价c
*输出参数:无
*返回值:无
************************************************************/
void CreateListR(CLinkList *&L,int a,std::string b,int c)//尾插法建立循环单链表
{
CLinkList *s,*r;
int i;
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域指向头结点
}
/***********************************************************
*功能描述:初始化链表
*输入参数:单链表L
*输出参数:无
*返回值:无
************************************************************/
void InitList(CLinkList *&L) //初始化链表
{
L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点
L->next=L;
}
/***********************************************************
*功能描述:删除模块
*输入参数:单链表L
*输出参数:无
*返回值:无
************************************************************/
void DestroyList(CLinkList *&L) //销毁链表
{
CLinkList *p=L,*q=p->next;
while (q!=L)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/***********************************************************
*功能描述:判断链表是否为空
*输入参数:单链表L1
*输出参数:无
*返回值:无
************************************************************/
bool ListEmpty(CLinkList *L) //判断链表是否为空
{
return(L->next==L);
}
/***********************************************************
*功能描述:输出链表长度
*输入参数:单链表L1
*输出参数:链表长度i
*返回值:链表长度i
************************************************************/
int ListLength(CLinkList *L) //求链表长度
{
CLinkList *p=L;
int i=0;
while (p->next!=L)
{
i++;
p=p->next;
}
return(i);
}
/***********************************************************
*功能描述:输出链表
*输入参数:单链表L
*输出参数:链表p
*返回值:无
************************************************************/
void DispList(CLinkList *L) //输出链表
{
CLinkList *p=L->next;
while (p!=L)
{
printf("%d ",p->seat);
cout<<p->person;
printf(" %d ",p->ID[0]);
p=p->next;
}
printf("\n");
}
/***********************************************************
*功能描述:取链表元素
*输入参数:单链表L1、座号e、姓名f、身份证号g
*输出参数:无
*返回值:真返回true,假返回false
************************************************************/
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;
}
/***********************************************************
*功能描述:查找元素模块
*输入参数:单链表L、身份证号e
*输出参数:无
*返回值:为真返回1或n,为假返回0
************************************************************/
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);
}
/***********************************************************
*功能描述:插入节点模块
*输入参数:单链表L、座位号e、姓名f、身份证号g
*输出参数:无
*返回值:无
************************************************************/
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;
}
}
}
/***********************************************************
*功能描述:删除节点模块
*输入参数:单链表L、座位号e、姓名f、身份证号g
*输出参数:无
*返回值:为真返回true,为假返回false
************************************************************/
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;
}
graph.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:graph.cpp
*文件标识:无
*内容摘要:该文件用于执行关于图的函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string>
#include "graph.h"
#include "function.h"
#include <iostream>
#include <string.h>
#include <windows.h>//休眠函数
#define MaxSize 100
using namespace std;
/***********************************************************
*功能描述:查找路径上的顶点
*输入参数:图g、起点、终点
*输出参数:无
*返回值:无
************************************************************/
void Ppath(int path[],int i,int v,MGraph g) //前向递归查找路径上的顶点
{
int k;
k=path[i];
if (k==v) return; //找到了起点则返回
Ppath(path,k,v,g); //找顶点k的前一个顶点
switch(k)
{
case 0 :
{
printf("%s,",g.vexs[0].city.c_str());
break;
}
case 1 :
{
printf("%s,",g.vexs[1].city.c_str());
break;
}
case 2 :
{
printf("%s,",g.vexs[2].city.c_str());
break;
}
case 3 :
{
printf("%s,",g.vexs[3].city.c_str());
break;
}
}
}
/***********************************************************
*功能描述:输出路径
*输入参数:图g、起点v,终点i
*输出参数:起点、终点、路径
*返回值:无
************************************************************/
void Dispath(int dist[],int path[],int s[],int n,int v,MGraph g,char m[20])//v是起点,i是终点,dist[]是路径长度即权值,path是路径,S是一个状态数组,为-1则不存在,为1则代表有最短路径,m为目的地
{
g.vexs[0].city="烟台";
g.vexs[1].city="济南";
g.vexs[2].city="北京";
g.vexs[3].city="上海";
int i;
for (i=0; i<n; i++)
if (s[i]==1 )
{
if(g.vexs[v].city.c_str()!=g.vexs[i].city.c_str() && g.vexs[i].city==m)
{
printf(" 从%s到%s的最短路径长度为:%d\t路径为:",g.vexs[v].city.c_str(), g.vexs[i].city.c_str(),dist[i]);
printf("%s,",g.vexs[v].city.c_str()); //输出路径上的起点
Ppath(path,i,v,g); //输出路径上的中间点
printf("%s\n",g.vexs[i].city.c_str()); //输出路径上的终点
}
}
}
/***********************************************************
*功能描述:最小路径
*输入参数:图g、源点v
*输出参数:无
*返回值:无
************************************************************/
void Dijkstra(MGraph g,int v,char m[20])//迪克斯特拉最短路径算法
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for (i=0; i<g.n; i++)
{
dist[i]=g.edges[v][i]; //距离初始化
s[i]=0;
//s[]置空
if (g.edges[v][i]<INF) //路径初始化
path[i]=v;
else
path[i]=-1;
}
s[v]=1;
path[v]=0; //源点编号v放入s中
for (i=0; i<g.n; i++) //循环直到所有顶点的最短路径都求出
{
mindis=INF; //mindis置最小长度初值
for (j=0; j<g.n; j++) //选取不在s中且具有最小距离的顶点u
if (s[j]==0 && dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1; //顶点u加入s中
for (j=0; j<g.n; j++) //修改不在s中的顶点的距离
if (s[j]==0)
if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
Dispath(dist,path,s,g.n,v,g,m); //输出最短路径
}
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
// n - 矩阵的阶数
// g - 要构造出来的邻接矩阵数据结构
/***********************************************************
*功能描述:构建邻接矩阵
*输入参数:图g、矩阵长度n
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:构建邻接表
*输入参数:图g、矩阵长度n
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:将邻接矩阵g转换成邻接表G
*输入参数:邻接矩阵g、邻接表G
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:将邻接表G转换成邻接矩阵g
*输入参数:邻接表G、邻接矩阵g
*输出参数:无
*返回值:无
************************************************************/
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;
}
}
}
/***********************************************************
*功能描述:输出邻接矩阵g
*输入参数:邻接矩阵g
*输出参数:邻接矩阵g
*返回值:无
************************************************************/
void DispMat(MGraph g)
//输出邻接矩阵g
{
int i,j;
for (i=0; i<g.n; i++)
{
for (j=0; j<g.n; j++)
if (g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
/***********************************************************
*功能描述:输出邻接表G
*输入参数:邻接表G
*输出参数:邻接表G
*返回值:无
************************************************************/
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");
}
}
/***********************************************************
*功能描述:最小路径模块
*输入参数:单链表L1、单链表L2、单链表L3、始发地c、目的地m
*输出参数:所有城市的出度、最大出度、始发地和目的地之间的最短路径
*返回值:无
************************************************************/
void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//最小路径
{
char xz;
MGraph g;
ALGraph *G;
int A[4][4]= //初始化城市距离
{
{0,2,INF,4},
{INF,0,3,INF},
{INF,INF,0,INF},
{INF,INF,5,0}
};
int B[4][4]= //初始化城市距离
{
{0,2,0,4},
{0,0,3,0},
{0,0,0,0},
{0,0,5,0}
};
char c[20],m[20];//为什么 string c,m不行?
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 欢迎进入观光航线订票界面 "<<endl;
cout<<" "<<endl;
cout<<" 我们共有2种路线供您选择 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 航线1: 烟台——济南——北京 "<<endl;
cout<<" "<<endl;
cout<<" 航线2: 烟台——上海——北京 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 附: "<<endl;
cout<<" 烟台——济南: 2小时 济南——北京: 3小时 "<<endl;
cout<<" "<<endl;
cout<<" 烟台——上海: 4小时 上海——北京: 5小时 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
ArrayToList(B[0],4,G);
OutDs(G);
cout<<" "<<endl;
cout<<" 可到达城市最多的是: "<<endl;
cout<<" "<<endl;
OutMaxDs(G);
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" "<<endl;
cout<<" 请输入您的出发地和目的地 "<<endl;
cin>>c>>m;//出发地和目的地
cout<<" "<<endl;
if(strcmp(c,"烟台")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,0,m);
cout<<" "<<endl;
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else if(strcmp(c,"济南")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,1,m);
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else if(strcmp(c,"上海")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,3,m);
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else
{
cout<<"抱歉您输入的地点暂不提供航班服务"<<endl;
}
}
/***********************************************************
*功能描述:输出图G中编号为v的顶点的出度
*输入参数:图G、顶点v
*输出参数:顶点v的出度n
*返回值:无
************************************************************/
//返回图G中编号为v的顶点的出度
int OutDegree(ALGraph *G,int v)
{
ArcNode *p;
int n=0;
p=G->adjlist[v].firstarc;
while (p!=NULL)
{
n++;
p=p->nextarc;
}
return n;
}
/***********************************************************
*功能描述:输出图G中出度最大的一个顶点
*输入参数:图G
*输出参数:出度最大的顶点maxds
*返回值:无
************************************************************/
//输出图G中出度最大的一个顶点
void OutMaxDs(ALGraph *G)
{
int maxv=0,maxds=0,i,x;
for (i=0; i<G->n; i++)
{
x=OutDegree(G,i);
if (x>maxds)
{
maxds=x;
maxv=i;
}
}
if(maxv==0)
printf(" 烟台,可到城市为 %d 个\n",maxds);
else if(maxv==1)
printf(" 济南,可到城市为 %d 个\n",maxds);
else if(maxv==2)
printf(" 北京,可到城市为 %d 个\n",maxds);
else if(maxv==3)
printf(" 上海,可到城市为 %d 个\n",maxds);
}
/***********************************************************
*功能描述:输出图G中每个顶点的出度
*输入参数:图G
*输出参数:每个顶点的出度
*返回值:无
************************************************************/
//输出图G中每个顶点的出度
void OutDs(ALGraph *G)
{
int i;
for (i=0; i<G->n; i++)
{
if(i==0)
printf(" 烟台可到达 %d 个城市\n",OutDegree(G,i));
else if(i==1)
printf(" 济南可到达 %d 个城市\n",OutDegree(G,i));
else if(i==2)
printf(" 北京可到达 %d 个城市\n",OutDegree(G,i));
else if(i==3)
printf(" 上海可到达 %d 个城市\n",OutDegree(G,i));
}
}
function.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:function.h
*文件标识:无
*内容摘要:该代码用于存放主页面下所有功能函数的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED
#include "linlist.h"
void show3();//主界面下的欢迎界面
void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//主界面
void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//订票
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询订票
int chaxun2(CLinkList *&L,int &e);//查询模块下具体进行查询的函数
void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//打印信息
void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询所有旅客信息
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//退票
void delet(CLinkList *&L,int &g);//退票模块下具体进行删除信息的函数
void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//显示航班信息
void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//改签
#endif // FUNCTION_H_INCLUDED
graph.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:graph.h
*文件标识:无
*内容摘要:该代码用于存放有关图的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include<string>
#include "linlist.h"
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示∞
typedef int InfoType;
//以下定义邻接矩阵类型
typedef struct
{
int no; //顶点编号
InfoType info; //顶点其他信息,在此存放带权图权值
std::string city; //存放城市的名字
} VertexType; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n,e; //顶点数,弧数
VertexType vexs[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 Dijkstra(MGraph g,int v,char m[20]);
void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);
int OutDegree(ALGraph *G,int v);
void OutMaxDs(ALGraph *G);
void OutDs(ALGraph *G);
#endif // GRAPH_H_INCLUDED
linlist.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:linlist.h
*文件标识:无
*内容摘要:该代码用于存放关于链表的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#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); //删除节点
#endif // CLINKLIST_H_INCLUDED
程序运行结果图:
*Copyright(c)2017,烟台大学计算机学院
*All right reserved.
*项目名:SK
*作者:盛凯
*完成日期:2017年12月22日
*版本号:v1.5
*
*问题描述:模拟航空订票业务,设计一个可以提供各种航班信息查询和服务的飞机订票系统。
*
main.cpp:
/***********************************************************
*版权所有(C)2017,S
1fb17
hengkai
*
*文件名称:main.cpp
*文件标识:无
*内容摘要:该文件用于存放主函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string>
#include <iostream>
#include "linlist.h"
#include "function.h"
#include "graph.h"
using namespace std;
int main()
{
CLinkList *L1; // 初始化航班1
InitList(L1);
CreateListR(L1,0,"烟台至北京",200);//航班的票数地点价格
CLinkList *L2; // 初始化航班2
InitList(L2);
CreateListR(L2,0,"烟台至上海",500);
CLinkList *L3; // 初始化航班3
InitList(L3);
CreateListR(L3,0,"烟台至乌鲁木齐",900);
show2(L1,L2,L3);
return 0;
}
function.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:function.cpp
*文件标识:无
*内容摘要:该文件用于执行主页面下的功能函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include "linlist.h"
#include "function.h"
#include <fstream> //输出文件流
#include <windows.h>//用到休眠函数
#include "graph.h"
using namespace std;
/***********************************************************
*功能描述:显示主界面下的欢迎界面
*输入参数:无
*输出参数:无
*返回值:无
************************************************************/
void show3()
{
system("color 8f");
cout<<endl<<endl;
cout<<"** * ** ****** * **** **** * * ******"<<endl;
cout<<" ** *** ** * * * * * * * * * * "<<endl;
cout<<" ** ** ** ** ***** * * * * * * * * ***** "<<endl;
cout<<" ** ** ** ** * * * * * * * * * * "<<endl;
cout<<" *** *** * * * * * * * * * * "<<endl;
cout<<" * * ****** ****** **** **** * * * ******"<<endl;
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━┓\n";
cout<<" ┃ 飞机订票系统 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃1.订票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃2.景点 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃3.订单查询 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃4.所有乘客信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃5.改签 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃6.退票 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃7.显示航班信息 ┃\n";
cout<<" ┃━━━━━━━━━━━━━┃\n";
cout<<" ┃0.退出 ┃\n";
cout<<" ┗━━━━━━━━━━━━━┛\n";
}
/***********************************************************
*功能描述:显示主界面
*输入参数:单链表L1、L2、L3,选择choice
*输出参数:无
*返回值:无
************************************************************/
void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int choice=10;
while(choice!=0)
{
show3();
cin >> choice;
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>choice;
}
switch(choice)
{
case 1:
{
system("cls");
yuding(L1,L2,L3);
choice=0;
break;
}
case 2:
{
system("cls");
road1(L1,L2,L3);
choice=0;
break;
}
case 3:
{
system("cls");
chaxun(L1,L2,L3);
choice=0;
break;
}
case 4:
{
system("cls");
searchall(L1,L2,L3);
choice=0;
break;
}
case 5:
{
system("cls");
gaiqian(L1,L2,L3);
choice=0;
break;
}
case 6:
{
system("cls");
tuipiao(L1,L2,L3);
choice=0;
break;
}
case 7:
{
system("cls");
xianshi(L1,L2,L3);
choice=0;
break;
}
case 0:
{
exit(0);
break;
}
}
}
}
/***********************************************************
*功能描述:预定机票模块
*输入参数:单链表L1、L2、L3、预定的航班号id、姓名y、身份证号z
*输出参数:无
*返回值:无
************************************************************/
void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int id,k,l1,l2,l3;
cout<<"请输入您要预订的航班号"<<endl;
cin>>id;
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>id;
}
if(id<1 || id>3)
{
cout<<"航号不存在,请重新输入"<<endl;
cin>>id;
}
else
{
{
int z;
std::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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
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==2)
{
cout<<"本次航班已卖完,请改乘其他航班"<<endl;
yuding(L1,L2,L3);
}
else
{
l3=ListLength(L3);
ListInsert(L3,l3,id,y,z,l3);
s->seat=s->seat+1;
}
}
system("cls");//清屏
cout<<" \n";
cout<<" \n";
cout<<" \n";
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
cout<<" \n";
cout<<" 订票成功 \n";
cout<<" \n";
cout<<" 座位号 姓名 身份证号 \n";
cout<<" \n";
if(id==1)
cout<<" "<<l1<<" "<<y<<" "<<z<<" \n";
else if(id==2)
cout<<" "<<l2<<" "<<y<<" "<<z<<" \n";
else if(id==3)
cout<<" "<<l3<<" "<<y<<" "<<z<<" \n";
cout<<" \n";
cout<<" \n";
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
cout<<" \n";
cout<<" 继续购票请按1 返回主菜单请按0 \n";
cin>>k;
if(k==1)
{
yuding(L1,L2,L3);//继续买票
}
else if (k==0)
{
show2(L1,L2,L3);
}
}
}
}
/***********************************************************
*功能描述:查询机票模块
*输入参数:单链表L1、L2、L3、身份证号id
*输出参数:无
*返回值:无
************************************************************/
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
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;
}
b=chaxun2(L1,id);
c=chaxun2(L2,id);
d=chaxun2(L3,id);
if((b+c+d)==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
cout<<" 查询完成 "<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
}
/***********************************************************
*功能描述:查询机票模块的子模块
*输入参数:单链表L 预定的航班号id
*输出参数:座号、姓名、身份证号
*返回值:成功返回0,不成功返回1
************************************************************/
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<<"------------------------------------------------------------------"<<endl;
cout<<endl;
cout<<"座号 姓名 身份证 "<<endl<<endl;
cout<<p->seat<<" "<<p->person<<" "<<e<<endl;
cout<<endl;
cout<<"------------------------------------------------------------------"<<endl;
return 1;
}
else
return 0;
}
/***********************************************************
*功能描述:打印乘客信息到文件模块
*输入参数:单链表L1、L2、L3、
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
fstream txtfile;
txtfile.open( "旅客信息.txt", ios::out ); //打开文件
txtfile<<" 旅客信息 "<<endl<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<" 航班号 座位号 姓名 身份证号 "<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
txtfile<<" 1号航班: "<<p->seat<<" "<<p->person<<" "<<p->ID[0]<<endl;
p=p->next;
}
CLinkList *q=L2->next;
while (q->next!=L2)
{
txtfile<<" 2号航班: "<<q->seat<<" "<<q->person<<" "<<q->ID[0]<<endl;
q=q->next;
}
CLinkList *r=L3->next;
while (r->next!=L3)
{
txtfile<<" 3号航班: "<<r->seat<<" "<<r->person<<" "<<r->ID[0]<<endl;
r=r->next;
}
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<" 感谢您的信任 祝您旅途愉快 "<<endl<<endl;//跳格,横向跳到下一制表位
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile<<"------------------------------------------------------------------"<<endl;
txtfile.close();
}
/***********************************************************
*功能描述:查询所有乘客信息模块
*输入参数:单链表L1、L2、L3、管理员密码passwd
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
char t;//状态字
int passwd=1997,k;
cout<<"请输入管理员密码"<<endl;
cin>>k;
if(k==passwd)
{
cout<<" 航班号 座号 姓名 身份证号"<<endl;
cout<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
cout<<" 1号航班: "<<p->seat<<" "<<p->person<<" "<<p->ID[0]<<endl;
p=p->next;
}
CLinkList *q=L2->next;
while (q->next!=L2)
{
cout<<" 2号航班: "<<q->seat<<" "<<q->person<<" "<<q->ID[0]<<endl;
q=q->next;
}
CLinkList *r=L3->next;
while (r->next!=L3)
{
cout<<" 3号航班: "<<r->seat<<" "<<r->person<<" "<<r->ID[0]<<endl;
r=r->next;
}
cout<<endl;
cout<<"是否打印所有旅客信息?"<<endl;
cin>>t;
if(t=='Y' || t=='y')
{
dayin(L1,L2,L3);
cout<<" 旅客信息打印成功!"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
else
{
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
}
else
{
cout<<"密码错误!"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);//返回主菜单
}
}
/***********************************************************
*功能描述:退票模块
*输入参数:单链表L1、L2、L3、航班号a
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
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下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *p=L1;
while (p->next!=L1)
{
p=p->next;
}
p->seat=p->seat-1;
delet(L1,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
case 2:
{
b=chaxun2(L2,id);
if(b==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *q=L2;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1;
delet(L2,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
case 3:
{
b=chaxun2(L3,id);
if(b==0)
{
cout<<"未查询到关于您的订票信息"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
else
{
CLinkList *s=L3;
while (s->next!=L3)
{
s=s->next;
}
s->seat=s->seat-1;
delet(L3,id);//删除
cout<<"已成功将您的订票删除"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
break;
}
}
}
/***********************************************************
*功能描述:退票模块下的一个子模块
*输入参数:单链表L、身份证号g
*输出参数:无
*返回值:无
************************************************************/
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);
}
/***********************************************************
*功能描述:显示所有航班信息模块
*输入参数:单链表L1、L2、L3
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//显示航班信息
{
cout<<" 航班信息查询 "<<endl;
cout<<" "<<endl;
cout<<" 剩余票数 航线 票价 "<<endl;
cout<<" "<<endl;
CLinkList *p=L1->next;
while (p->next!=L1)
{
p=p->next;
}
cout<<"1号航班: "<<2-(p->seat)<<" "<<p->person<<" "<<p->ID[0]<<endl;
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
cout<<"2号航班: "<<2-(q->seat)<<" "<<q->person<<" "<<q->ID[0]<<endl;
CLinkList *r=L3->next;
while (r->next!=L3)
{
r=r->next;
}
cout<<"3号航班: "<<2-(r->seat)<<" "<<r->person<<" "<<r->ID[0]<<endl;
cout<<"即将返回主菜单"<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
}
/***********************************************************
*功能描述:改签模块
*输入参数:单链表L1、L2、L3、原航班号a、改签航班号e、姓名y、身份证号id
*输出参数:座号、姓名、身份证号
*返回值:无
************************************************************/
void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
{
int id,a,b,c,d,e,l1,l2,l3;//id为身份证号,b、c、d用来放返回值,a为原航班号,e为改签航班号
std::string y;//姓名
cout<<" 请填写以下信息 "<<endl;
cout<<" 姓名 身份证号 "<<endl;
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);
show2(L1,L2,L3);
}
else
{
cout<<"请输入您的航班号和您要改签的航班号"<<endl;
cin>>a>>e;
if(a<1 || a>3 || e<1 || e>3)
{
cout<<"航号不存在,请重新输入"<<endl;
cin>>a>>e;
}
while(!cin)
{
cout<<"输入错误,请重新输入:"<<endl;
cin.sync();
cin.clear();
cin>>a>>e;
}
switch(e)
{
case 1:
{
CLinkList *p=L1->next;
while (p->next!=L1)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
delet(L2,id);//删除原航班机票
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L1);//购买新机票
ListInsert(L1,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
delet(L3,id);//删除原航班机票
CLinkList *q=L3->next;
while (q->next!=L3)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L1);//购买新机票
ListInsert(L1,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
case 2:
{
CLinkList *p=L2->next;
while (p->next!=L2)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
delet(L1,id);//删除原航班机票
CLinkList *q=L1->next;
while (q->next!=L1)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L2);//购买新机票
ListInsert(L2,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
delet(L3,id);//删除原航班机票
CLinkList *q=L3->next;
while (q->next!=L3)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L2);//购买新机票
ListInsert(L2,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
case 3:
{
CLinkList *p=L3->next;
while (p->next!=L3)
{
p=p->next;
}
if(p->seat==2)
{
cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
switch(a)
{
case 1:
{
delet(L1,id);//删除原航班机票
CLinkList *q=L1->next;
while (q->next!=L1)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L3);//购买新机票
ListInsert(L3,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 2:
{
delet(L2,id);//删除原航班机票
CLinkList *q=L2->next;
while (q->next!=L2)
{
q=q->next;
}
q->seat=q->seat-1; //原机票已退
l2=ListLength(L3);//购买新机票
ListInsert(L3,l2,id,y,id,l2);
p->seat=p->seat+1;
cout<<"改签成功"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
case 3:
{
cout<<"请输入正确的改签航班号"<<endl;
cout<<" 即将返回到主菜单 "<<endl;
Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
show2(L1,L2,L3);
break;
}
}
}
break;
}
}
}
}
linlist.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:linlist.cpp
*文件标识:无
*内容摘要:该文件用于执行有关链表功能的函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
//循环单链表基本运算函数
#include <stdio.h>
#include <malloc.h>
#include <iostream>
#include "linlist.h"
using namespace std;
/***********************************************************
*功能描述:头插法
*输入参数:单链表L、机票数a、始发地和目的地b、票价c
*输出参数:无
*返回值:无
************************************************************/
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域指向头结点
}
/***********************************************************
*功能描述:尾插法
*输入参数:单链表L、机票数a、始发地和目的地b、票价c
*输出参数:无
*返回值:无
************************************************************/
void CreateListR(CLinkList *&L,int a,std::string b,int c)//尾插法建立循环单链表
{
CLinkList *s,*r;
int i;
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域指向头结点
}
/***********************************************************
*功能描述:初始化链表
*输入参数:单链表L
*输出参数:无
*返回值:无
************************************************************/
void InitList(CLinkList *&L) //初始化链表
{
L=(CLinkList *)malloc(sizeof(CLinkList)); //创建头结点
L->next=L;
}
/***********************************************************
*功能描述:删除模块
*输入参数:单链表L
*输出参数:无
*返回值:无
************************************************************/
void DestroyList(CLinkList *&L) //销毁链表
{
CLinkList *p=L,*q=p->next;
while (q!=L)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
/***********************************************************
*功能描述:判断链表是否为空
*输入参数:单链表L1
*输出参数:无
*返回值:无
************************************************************/
bool ListEmpty(CLinkList *L) //判断链表是否为空
{
return(L->next==L);
}
/***********************************************************
*功能描述:输出链表长度
*输入参数:单链表L1
*输出参数:链表长度i
*返回值:链表长度i
************************************************************/
int ListLength(CLinkList *L) //求链表长度
{
CLinkList *p=L;
int i=0;
while (p->next!=L)
{
i++;
p=p->next;
}
return(i);
}
/***********************************************************
*功能描述:输出链表
*输入参数:单链表L
*输出参数:链表p
*返回值:无
************************************************************/
void DispList(CLinkList *L) //输出链表
{
CLinkList *p=L->next;
while (p!=L)
{
printf("%d ",p->seat);
cout<<p->person;
printf(" %d ",p->ID[0]);
p=p->next;
}
printf("\n");
}
/***********************************************************
*功能描述:取链表元素
*输入参数:单链表L1、座号e、姓名f、身份证号g
*输出参数:无
*返回值:真返回true,假返回false
************************************************************/
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;
}
/***********************************************************
*功能描述:查找元素模块
*输入参数:单链表L、身份证号e
*输出参数:无
*返回值:为真返回1或n,为假返回0
************************************************************/
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);
}
/***********************************************************
*功能描述:插入节点模块
*输入参数:单链表L、座位号e、姓名f、身份证号g
*输出参数:无
*返回值:无
************************************************************/
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;
}
}
}
/***********************************************************
*功能描述:删除节点模块
*输入参数:单链表L、座位号e、姓名f、身份证号g
*输出参数:无
*返回值:为真返回true,为假返回false
************************************************************/
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;
}
graph.cpp:
/***********************************************************
*版权所有(C)2017,Shengkai
*
*文件名称:graph.cpp
*文件标识:无
*内容摘要:该文件用于执行关于图的函数
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string>
#include "graph.h"
#include "function.h"
#include <iostream>
#include <string.h>
#include <windows.h>//休眠函数
#define MaxSize 100
using namespace std;
/***********************************************************
*功能描述:查找路径上的顶点
*输入参数:图g、起点、终点
*输出参数:无
*返回值:无
************************************************************/
void Ppath(int path[],int i,int v,MGraph g) //前向递归查找路径上的顶点
{
int k;
k=path[i];
if (k==v) return; //找到了起点则返回
Ppath(path,k,v,g); //找顶点k的前一个顶点
switch(k)
{
case 0 :
{
printf("%s,",g.vexs[0].city.c_str());
break;
}
case 1 :
{
printf("%s,",g.vexs[1].city.c_str());
break;
}
case 2 :
{
printf("%s,",g.vexs[2].city.c_str());
break;
}
case 3 :
{
printf("%s,",g.vexs[3].city.c_str());
break;
}
}
}
/***********************************************************
*功能描述:输出路径
*输入参数:图g、起点v,终点i
*输出参数:起点、终点、路径
*返回值:无
************************************************************/
void Dispath(int dist[],int path[],int s[],int n,int v,MGraph g,char m[20])//v是起点,i是终点,dist[]是路径长度即权值,path是路径,S是一个状态数组,为-1则不存在,为1则代表有最短路径,m为目的地
{
g.vexs[0].city="烟台";
g.vexs[1].city="济南";
g.vexs[2].city="北京";
g.vexs[3].city="上海";
int i;
for (i=0; i<n; i++)
if (s[i]==1 )
{
if(g.vexs[v].city.c_str()!=g.vexs[i].city.c_str() && g.vexs[i].city==m)
{
printf(" 从%s到%s的最短路径长度为:%d\t路径为:",g.vexs[v].city.c_str(), g.vexs[i].city.c_str(),dist[i]);
printf("%s,",g.vexs[v].city.c_str()); //输出路径上的起点
Ppath(path,i,v,g); //输出路径上的中间点
printf("%s\n",g.vexs[i].city.c_str()); //输出路径上的终点
}
}
}
/***********************************************************
*功能描述:最小路径
*输入参数:图g、源点v
*输出参数:无
*返回值:无
************************************************************/
void Dijkstra(MGraph g,int v,char m[20])//迪克斯特拉最短路径算法
{
int dist[MAXV],path[MAXV];
int s[MAXV];
int mindis,i,j,u;
for (i=0; i<g.n; i++)
{
dist[i]=g.edges[v][i]; //距离初始化
s[i]=0;
//s[]置空
if (g.edges[v][i]<INF) //路径初始化
path[i]=v;
else
path[i]=-1;
}
s[v]=1;
path[v]=0; //源点编号v放入s中
for (i=0; i<g.n; i++) //循环直到所有顶点的最短路径都求出
{
mindis=INF; //mindis置最小长度初值
for (j=0; j<g.n; j++) //选取不在s中且具有最小距离的顶点u
if (s[j]==0 && dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
s[u]=1; //顶点u加入s中
for (j=0; j<g.n; j++) //修改不在s中的顶点的距离
if (s[j]==0)
if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
{
dist[j]=dist[u]+g.edges[u][j];
path[j]=u;
}
}
Dispath(dist,path,s,g.n,v,g,m); //输出最短路径
}
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
// n - 矩阵的阶数
// g - 要构造出来的邻接矩阵数据结构
/***********************************************************
*功能描述:构建邻接矩阵
*输入参数:图g、矩阵长度n
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:构建邻接表
*输入参数:图g、矩阵长度n
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:将邻接矩阵g转换成邻接表G
*输入参数:邻接矩阵g、邻接表G
*输出参数:无
*返回值:无
************************************************************/
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;
}
/***********************************************************
*功能描述:将邻接表G转换成邻接矩阵g
*输入参数:邻接表G、邻接矩阵g
*输出参数:无
*返回值:无
************************************************************/
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;
}
}
}
/***********************************************************
*功能描述:输出邻接矩阵g
*输入参数:邻接矩阵g
*输出参数:邻接矩阵g
*返回值:无
************************************************************/
void DispMat(MGraph g)
//输出邻接矩阵g
{
int i,j;
for (i=0; i<g.n; i++)
{
for (j=0; j<g.n; j++)
if (g.edges[i][j]==INF)
printf("%3s","∞");
else
printf("%3d",g.edges[i][j]);
printf("\n");
}
}
/***********************************************************
*功能描述:输出邻接表G
*输入参数:邻接表G
*输出参数:邻接表G
*返回值:无
************************************************************/
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");
}
}
/***********************************************************
*功能描述:最小路径模块
*输入参数:单链表L1、单链表L2、单链表L3、始发地c、目的地m
*输出参数:所有城市的出度、最大出度、始发地和目的地之间的最短路径
*返回值:无
************************************************************/
void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//最小路径
{
char xz;
MGraph g;
ALGraph *G;
int A[4][4]= //初始化城市距离
{
{0,2,INF,4},
{INF,0,3,INF},
{INF,INF,0,INF},
{INF,INF,5,0}
};
int B[4][4]= //初始化城市距离
{
{0,2,0,4},
{0,0,3,0},
{0,0,0,0},
{0,0,5,0}
};
char c[20],m[20];//为什么 string c,m不行?
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 欢迎进入观光航线订票界面 "<<endl;
cout<<" "<<endl;
cout<<" 我们共有2种路线供您选择 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 航线1: 烟台——济南——北京 "<<endl;
cout<<" "<<endl;
cout<<" 航线2: 烟台——上海——北京 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" 附: "<<endl;
cout<<" 烟台——济南: 2小时 济南——北京: 3小时 "<<endl;
cout<<" "<<endl;
cout<<" 烟台——上海: 4小时 上海——北京: 5小时 "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
cout<<" "<<endl;
ArrayToList(B[0],4,G);
OutDs(G);
cout<<" "<<endl;
cout<<" 可到达城市最多的是: "<<endl;
cout<<" "<<endl;
OutMaxDs(G);
cout<<" "<<endl;
cout<<" "<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<" "<<endl;
cout<<" 请输入您的出发地和目的地 "<<endl;
cin>>c>>m;//出发地和目的地
cout<<" "<<endl;
if(strcmp(c,"烟台")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,0,m);
cout<<" "<<endl;
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else if(strcmp(c,"济南")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,1,m);
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else if(strcmp(c,"上海")==0)
{
ArrayToMat(A[0],4,g);
Dijkstra(g,3,m);
cout<<" 是否退出飞机订票系统?"<<endl;
cin>>xz;
if(xz=='Y' || xz=='y')
{
cout<<"感谢您的使用!"<<endl;
Sleep(2000);
exit(0);
}
else if (xz=='N' || xz=='n')
{
cout<<"即将返回主界面!"<<endl;
Sleep(2000);
show2(L1,L2,L3);
}
else
{
cout<<"请正确输入!"<<endl;
cin>>xz;
}
}
else
{
cout<<"抱歉您输入的地点暂不提供航班服务"<<endl;
}
}
/***********************************************************
*功能描述:输出图G中编号为v的顶点的出度
*输入参数:图G、顶点v
*输出参数:顶点v的出度n
*返回值:无
************************************************************/
//返回图G中编号为v的顶点的出度
int OutDegree(ALGraph *G,int v)
{
ArcNode *p;
int n=0;
p=G->adjlist[v].firstarc;
while (p!=NULL)
{
n++;
p=p->nextarc;
}
return n;
}
/***********************************************************
*功能描述:输出图G中出度最大的一个顶点
*输入参数:图G
*输出参数:出度最大的顶点maxds
*返回值:无
************************************************************/
//输出图G中出度最大的一个顶点
void OutMaxDs(ALGraph *G)
{
int maxv=0,maxds=0,i,x;
for (i=0; i<G->n; i++)
{
x=OutDegree(G,i);
if (x>maxds)
{
maxds=x;
maxv=i;
}
}
if(maxv==0)
printf(" 烟台,可到城市为 %d 个\n",maxds);
else if(maxv==1)
printf(" 济南,可到城市为 %d 个\n",maxds);
else if(maxv==2)
printf(" 北京,可到城市为 %d 个\n",maxds);
else if(maxv==3)
printf(" 上海,可到城市为 %d 个\n",maxds);
}
/***********************************************************
*功能描述:输出图G中每个顶点的出度
*输入参数:图G
*输出参数:每个顶点的出度
*返回值:无
************************************************************/
//输出图G中每个顶点的出度
void OutDs(ALGraph *G)
{
int i;
for (i=0; i<G->n; i++)
{
if(i==0)
printf(" 烟台可到达 %d 个城市\n",OutDegree(G,i));
else if(i==1)
printf(" 济南可到达 %d 个城市\n",OutDegree(G,i));
else if(i==2)
printf(" 北京可到达 %d 个城市\n",OutDegree(G,i));
else if(i==3)
printf(" 上海可到达 %d 个城市\n",OutDegree(G,i));
}
}
function.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:function.h
*文件标识:无
*内容摘要:该代码用于存放主页面下所有功能函数的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#ifndef FUNCTION_H_INCLUDED
#define FUNCTION_H_INCLUDED
#include "linlist.h"
void show3();//主界面下的欢迎界面
void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//主界面
void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//订票
void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询订票
int chaxun2(CLinkList *&L,int &e);//查询模块下具体进行查询的函数
void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//打印信息
void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询所有旅客信息
void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//退票
void delet(CLinkList *&L,int &g);//退票模块下具体进行删除信息的函数
void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//显示航班信息
void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//改签
#endif // FUNCTION_H_INCLUDED
graph.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:graph.h
*文件标识:无
*内容摘要:该代码用于存放有关图的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include<string>
#include "linlist.h"
#define MAXV 100 //最大顶点个数
#define INF 32767 //INF表示∞
typedef int InfoType;
//以下定义邻接矩阵类型
typedef struct
{
int no; //顶点编号
InfoType info; //顶点其他信息,在此存放带权图权值
std::string city; //存放城市的名字
} VertexType; //顶点类型
typedef struct //图的定义
{
int edges[MAXV][MAXV]; //邻接矩阵
int n,e; //顶点数,弧数
VertexType vexs[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 Dijkstra(MGraph g,int v,char m[20]);
void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);
int OutDegree(ALGraph *G,int v);
void OutMaxDs(ALGraph *G);
void OutDs(ALGraph *G);
#endif // GRAPH_H_INCLUDED
linlist.h:
/***********************************************************
版权所有(C)2017,Shengkai
*
*文件名称:linlist.h
*文件标识:无
*内容摘要:该代码用于存放关于链表的函数声明
*其它说明:无
*当前版本:V1.5
*作者:盛凯
*完成日期:20171222
*
**********************************************************/
#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); //删除节点
#endif // CLINKLIST_H_INCLUDED
程序运行结果图:
相关文章推荐
- 数据结构课程设计--飞机订票系统
- 数据结构课程设计 飞机订票系统
- 数据结构课程设计--航空客运订票系统
- 数据结构课程设计之航空订票系统
- 数据结构课程设计论文--学生信息管理系统
- 数据结构课程设计--学生成绩管理系统
- 数据结构课程设计-ytu职工信息管理系统
- 数据结构课程设计-宿舍管理系统
- 数据结构课程设计之通讯录管理系统
- 数据结构课程设计——学生成绩管理系统
- 数据结构课程设计—学生信息管理系统
- 大一C语言课程设计--飞机订票系统
- 数据结构课程设计———烟台大学导游系统
- 数据结构课程设计:学成成绩管理系统
- 数据结构课程设计--“模拟图书管理系统的开发”
- 数据结构课程设计——通讯录管理系统
- 数据结构课程设计--学生信息管理系统
- 数据结构课程设计图书管理系统
- 数据结构课程设计【银行储蓄系统】
- 数据结构课程设计 成绩管理系统