航空订票系统c++数据结构大作业_第1页
航空订票系统c++数据结构大作业_第2页
航空订票系统c++数据结构大作业_第3页
航空订票系统c++数据结构大作业_第4页
航空订票系统c++数据结构大作业_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include#include#include#include#define M 450/定义数组的空间为不可改变的整数using namespace std;int main();/申明主函数struct flight/航班信息char terminal10;/终点站名char number10;/航班号char id10;/飞机号char date10;/飞行日期int member;/乘员定额int rest;/余票量struct flight * next;/指向下一个节点的指针;struct custom/客户信息char name10;/姓名char number10;/航班号int count;/数量int grade;/舱位等级struct custom * next;/指向下一个节点的指针;struct flight *aM;/flight类型的指针数组struct node/二叉树节点 struct custom * base; node *r;/左孩子 node *l;/右孩子; char ch100;int judge(char (&ch)100) int i,s=0,x=0; if(strlen(ch)=3)for(i=0;i=0&chi=9) s+; if(s=strlen(ch)for(i=0;istrlen(ch);i+)x=x*10+chi-48;return x; else return 0;else return 0; int hash(unsigned long k)return k%M;/取余unsigned long hashvalue(char *str)/将输入字符串转换成长整型数返回int i,l; unsigned long ret=0; unsigned short *s; if (str = NULL) return(0); l=(strlen(str)+1)/2; s=(unsigned short *)str; for (i=0; il;i+) ret=(sis-terminals-numbers-ids-dates-members-rest)/提取文件信息val=hash(hashvalue(s-terminal);while(ahash(val)!=NULL)/如果数组中的元素不为空,建立链表if(!strcmp(ahash(val)-terminal,s-terminal)t=ahash(val);while(t-next)/将节点往下移,直至最后节点t=t-next;t-next=s;t=s;t-next=NULL;/末尾节点的next赋空break;else val+;/哈希表冲突,往数组后面的空位移动if(ahash(val)=NULL)/如果哈希表中元素为空,赋给从文件中提取的值ahash(val)=s;ahash(val)-next=NULL;s=new flight;obj.close();/关闭文件void create(node *&root,custom *&s) /生成二分查找树 custom *t=new custom;if(root=NULL) /当该节点为空时赋值 root=new node; root-base=s; root-l=NULL; root-r=NULL; else if(hash(hashvalue(s-name)hash(hashvalue(root-base-name)create(root-r,s); /比当前节点小,往左孩子移else if(hash(hashvalue(s-name)base-name) create(root-l,s); /比当前节点大,往右孩子移else /等于当前节点t=root-base;while(t-next!=NULL)/将节点往下移,直至最后节点t=t-next;t-next=s;/到尾部添加形成线性表t=s;t-next=NULL;/末尾节点的next赋空void print(node *&root,char *&name)/输出要查找的值custom *t=new custom;if(root!=NULL)/如果节点不为空if(root-l!=NULL & hash(hashvalue(name)base-name)print(root-l,name);/比当前节点小else if(root-r!=NULL & hash(hashvalue(name)hash(hashvalue(root-base-name)print(root-r,name);/比当前节点大else if(hash(hashvalue(name)=hash(hashvalue(root-base-name)/等于当前节点t=root-base;coutsetiosflags(ios:left)setw(10)客户姓名setw(10)航班号setw(10)票量setw(10)舱位等级endl;/标明输出信息while(t!=NULL)/输出找到的线性表coutsetiosflags(ios:left)setw(10)namesetw(10)numbersetw(10)countsetw(10)gradenext;delete t;else cout无该客户信息!l!=NULL & hash(hashvalue(name)base-name)get(root-l,name);/比当前节点小else if(root-r!=NULL & hash(hashvalue(name)hash(hashvalue(root-base-name)get(root-r,name);/比当前节点大else if(hash(hashvalue(name)=hash(hashvalue(root-base-name)/等于当前节点return root-base;else cout无该客户信息!s-names-numbers-counts-grade) s-next=NULL,create(root,s),s=new custom;/将文件内容放入二分查找树obj.close();return root;struct flight* head()/将航班信息文件内容放到线性表,并返回头节点ifstream obj3;obj3.open(d:fly.txt,ios:in);flight *s,*p,*h;h=new flight;h=NULL;s=new flight;p=new flight;while(obj3s-terminals-numbers-ids-dates-members-rest)if(h=NULL)/建立线性表h=s;else p-next=s;p=s;s=new flight;p-next=NULL;/末尾节点的next赋空delete s;/删除中间变量,释放空间obj3.close();return h;/返回头节点struct custom* first(int n)/将客户信息文件内容放到顺序表,并返回头节点ifstream obj3;if(n=1)obj3.open(d:custom.txt,ios:in);/打开订票客户信息文件else obj3.open(d:wait.txt,ios:in);/打开候补客户信息文件custom *s,*p,*h;h=new custom;h=NULL;s=new custom;p=new custom;while(obj3s-names-numbers-counts-grade)if(h=NULL)/建立线性表h=s;else p-next=s;p=s;/添加节点给线性表s=new custom;/给s分配新的空间p-next=NULL;delete s;obj3.close();return h;void search()/根据终点站名查找航班信息hashlist();int m=0;string s1;flight *t=new flight;char ter10;int choice=1,val;while(choice)coutter;val=hash(hashvalue(ter);while(aval!=NULL & strcmp(aval-terminal,ter) val+;/如果终点站名对应的取余相等,往数组后面移动查询if(ahash(val)=NULL) cout没有到该终点站的航班信息!endl;/没有找到航班信息elset=ahash(val);coutsetiosflags(ios:left)setw(10)终点站名setw(10)航班号setw(10)/标明输出信息飞机号setw(10)飞行日期setw(10)成员定额setw(10)余票量endl;while(t!=NULL)coutsetiosflags(ios:left)setw(10)terminalsetw(10)numbersetw(10)idsetw(10)datesetw(10)membersetw(10)restnext;m=0;while(!m)/选择是否继续查询couts1;/选择是否继续查询if(s1!=0& s1!=1) cout错误!只能输入或endl;else if(s1=0) choice=0,m=1;else if(s1=1) choice=1,m=1;for(int i=0;iM;i+)ai=NULL;/清空哈希表system(cls);/清屏main();/调用主函数,返回菜单栏void findcustom()/查找客户信息int choice,z=1;int m=0;string s1;char *name;node *find=new node;name=new char10;system(cls);/清屏cout*n选择菜单n查询已经订票的客户信息n查询候补客户信息n*n;while(z)/选择执行m=0;while(!m)couts1;if(s1!=2& s1!=1) cout错误!只能输入或endl;else if(s1=1) choice=1,m=1;else if(s1=2) choice=2,m=1;if(choice=1)coutname;find=intseart(name,choice);/调用查找函数,查询已订票客户信息if(find!=NULL)print(find,name);else cout文件不存在,无人订票,无需再查!endl;else if(choice=2)coutname;find=intseart(name,choice);/调用查找函数,查询候补客户信息if(find!=NULL)print(find,name);else cout文件不存在,无人候补,无需再查!endl;m=0;while(!m)/选择是否继续查询couts1;/选择是否继续查询if(s1!=0& s1!=1) cout错误!只能输入或endl;else if(s1=0) z=0,m=1;else if(s1=1) z=1,m=1;system(cls);/清屏main();/返回主菜单void book()/订票int m=0;string s1;custom *s=new custom,*h=new custom,*h1=new custom,*t=new custom,*t1=new custom;flight *mem;h=NULL,h1=NULL;/头结点赋空int choice,x=0,y=0,amount,v,choice1;int z=1;while(z)v=1;while(v)mem=head();int u=0;couts-number;/根据输入的航班号查询while(mem&!u)if(!strcmp(s-number,mem-number) u=1,v=0;/判断是否找到该航班if(u=0)mem=mem-next;if(u=0)cout对不起,该航线末找到!endl;/未找到该航班m=0;while(!m)/选择是否继续退票couts1;/选择是否继续退票if(s1!=0& s1!=1) cout错误!只能输入或endl;else if(s1=0) choice1=0,m=1;else if(s1=1) choice1=1,m=1;/选择是否继续订票v=1;z=0;int i,df=0; m=0;while(!m)coutch; if(strlen(ch)=3)for(i=0;i=0&chi=9) df+; if(df=strlen(ch)for(i=0;istrlen(ch);i+)m=m*10+chi-48; else m=0;else m=0;amount=m;if(m=0)cout输入错误!必须输入不超过三位数的整数!mem-member) cout订票数量超过乘员定额!endl;/订票数量超过乘员定额 else if(amountrest)/满足订票条件 x=1; s-count=amount; couts-name; m=0;while(!m)couts1;if(s1!=1& s1!=2 & s1!=3) cout错误!只能输入或或grade=1,m=1;else if(s1=2) s-grade=2,m=1;else if(s1=3) s-grade=3,m=1;if(h=NULL) h=s;/将订票的客户信息放到线性表里暂时储存else t-next=s;t=s;s=new custom; else m=0;while(!m)/选择是否继续订票couts1;if(s1!=0& s1!=1) cout错误!只能输入或count=amount; couts-name; m=0;while(!m)couts1;if(s1!=1& s1!=2 & s1!=3) cout错误!只能输入或或grade=1,m=1;else if(s1=2) s-grade=2,m=1;else if(s1=3) s-grade=3,m=1;if(h1=NULL) h1=s;/把排队客户的信息放到线性表里暂时储存 else t1-next=s; t1=s; s=new custom; m=0;while(!m)/选择是否继续订票couts1;if(s1!=0& s1!=1) cout错误!只能输入或next=NULL;t1-next=NULL;/将尾节点的next赋空if(x=1)/判断是否有人订票成功ofstream obj5;ifstream obj;obj5.open(d:custom.txt,ios:out|ios:app);flight *n=new flight;custom *p=new custom,*s=new custom;p=h;while(p)/将订票信息添加的客户信息文件中obj5nametnumbertcounttgradenext;obj5.close();n=head();ofstream message;message.open(d:fly.txt,ios:out);while(n)/如果有人订票成功,修改航班信息的余票量p=new custom;p=h;while(p)if(!strcmp(p-number,n-number)/找到被订票的航班n-rest-=p-count;p=p-next;messageterminaltnumbertidtdatetmembertrestnext;/覆盖原来的内容,把线性表中内容存入文件message.close();if(y=1)/如果有人候补,把信息添加到候补客户信息文件中ofstream obj6;obj6.open(d:wait.txt,ios:out|ios:app);while(h1)obj6nametnumbertcounttgradenext;obj6.close();delete s;system(cls);/清屏main();/返回主菜单void quit()/退票char *name;int m=0;string s1;char number10;name=new char10;custom *t=new custom;node *my=new node;int amount=0;int z=1,y=1;while(z)coutname;coutnumber;my=intseart(name,1);/调用二分查找树生成函数t=get(my,name);/用二分查找树找到该客户信息while(t)if(!strcmp(t-number,number) break;/判断航班号是否相等t=t-next;if(t!=NULL)fstream obj;custom *h=first(1);/调用函数返回头节点obj.open(d:custom.txt,ios:out);while(h)if(!strcmp(h-name,name) & !strcmp(h-number,number)/根据输入姓名和航班号找到要退票的客户信息amount+=h-count;else objnametnumbertcounttgradenext;/节点往下移动obj.close();flight *n,*m;custom *p=first(2),*q;/提取等候客户文件信息头结点q=p;int shu;n=head();/提取航班信息头结点m=n;while(n)if(!strcmp(number,n-number)shu=(amount + n-rest);while(p)if(!strcmp(p-number,number)/在航班信息找找到客户退掉的航班if(shu=p-count)shu-=p-count;n-rest=shu;cout航班号为number的候补乘客已订票成功rest=shu;cout所退票无法满足等候客户需求next;break;n=n-next;if(y)obj.open(d:wait.txt,ios:out);while(q)/ 删除订票成功的等候客户的信息if(strcmp(q-name,name)&strcmp(q-number,number)objnametnumbertcounttgradenext;obj.close();fstream objx;/添加等候客户的信息到定好票的客户信息文件中objx.open(d:custom.txt,ios:out|ios:app);objxnametnumbertcounttgradenumber,n-number)objectterminaltnumbertidtdatetmembertrestn; else objectterminaltnumbertidtdatetmembertrestnext;object.close();m=0;while(!m)/选择是否继续退票couts1;/选择是否继续退票if(s1!=0& s1!=1) cout错误!只能输入或endl;else if(s1=0) z=0,m=1;else if(s1=1) z=1,m=1;system(cls);main();void add()flight *head;string s1;flight *p=new flight;flight *s,*n;head=p;int pan,jue=1;fstream obj1;obj1.open(d:fly.txt,ios:app|ios:out);/以写的方式打开,并可以追加coutp-terminal;/ 根据提示输入信息coutp-number; coutp-id;int m=0;while(!m)coutp-date;if(hashvalue(p-date)=hashvalue(星期一)|hashvalue(p-date)=hashvalue(星期二)| hashvalue(p-date)=hashvalue(星期三)|hashvalue(p-date)=hashvalue(星期四)| hashvalue(p-date)=hashvalue(星期五)|hashvalue(p-date)=hashvalue(星期六)| hashvalue(p-date)=hashvalue(星期日)m=1;else cout错误!必须输入汉字(星期一到星期日)endl; m=0;while(!m)coutch;p-member=judge(ch);m=p-member;if(m=0)cout输入错误!必须输入三位数的整数!p-member)coutch;p-rest=judge(ch);m=p-rest;if(m=0|mp-member)cout输入错误!必须输入三位数的整数并且小于等于乘员定额!endl;while(p!=NULL)m=0;while(!m)couts1;/选择是否继续录入if(s1!=0& s1!=1) cout错误!只能输入或endl;else if(s1=0) pan=0,m=1;else if(s1=1) pan=1,m=1;if(pan=1)s=new flight;couts-terminal;/ 根据提示输入信息couts-number; couts-id; m=0;while(!m)couts-date;if(hashvalue(s-date)=hashvalue(星期一)|hashvalue(s-date)=hashvalue(星期二)| hashvalue(s-date)=hashvalue(星期三)|hashvalue(s-date)=hashvalue(星期四)| hashvalue(s-date)=hashvalue(星期五)|hashvalue(s-date)=hashvalue(星期六)| hashvalue(s-date)=hashvalue(星期日)m=1;else cout错误!必须输入汉字(星期一到星期日)endl; m=0;while(!m)coutch;s-member=judge(ch);m=s-member;if(m=0)cout输入错误!必须输入三位数的整数!s-member)coutch;s-rest=judge(ch);m=s-rest;if(m=0|ms-member)cout输入错误!必须输入三位数的整数并且小于等于乘员定额!next=s;p=s;p-next=NULL;/将添加的航班信息放到顺序表里elsep-next=NULL;p=p-next; n=head;while(n)/将添加的航班信息追加到航班信息文件中obj1terminaltnumbertidtdatetmembertrestnext;obj1.close();system(cls);/ 清屏cout录入成功endl;main();/返回主菜单void exit()/退出程序system(cls);cout*成功退出,欢迎再次使用!*en

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论