长代码大神救救我吧
本帖最后由 东瓜皮6688 于 2020-12-23 18:53 编辑316行那个循环开始就不行了,我也不太清楚,求大神解救啊,从订票流程开始就不行了,运行到一半后面的就运行不出来了,求大神解救啊
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
#define MAX 60
typedef struct Customer //乘客信息,使用链表存储结构
{
char Name; //姓名
int Amount; //订票数
char Rank; //航班等级
int IDinfor; //个人信息
struct Customer *Next; //指向下一个乘客结点
}Customer; //指针类型,定义指针 p2页
typedef struct Flight //航班信息,仍使用链表存储结构
{
char Des_Name; //终点名字
char Flight_No; //航班号
char Plane_No; //飞机型号
int Week_Day; //飞机周日(星期几)
int Customer_Amount; //乘员定额
int Free_Amount; //剩余票数
int Price; //航位等级价格
Customer *CustName; //该航班已订票胡乘客名单
Customer *ReplName; //该航班胡候补乘客名单
struct Flight *Next; //指示下一个航班结点
}Flight,*PFlight;
//全局变量
int Customer_Count=0; //所有航班的订票乘客总数
Flight *Head=(PFlight)malloc(sizeof(Flight)); //航班头指针
Flight *p2=(PFlight)malloc(sizeof(Flight)); //航班结点指针
Customer *Custp1; //各航班乘客结点指针
Customer *Replp1; //各航班候补结点指针
int IsEmpty=1; //是否有订票乘客初始化为1即空
int IsReplace=1; //是否有候补乘客
Customer *prior; //订票乘客前结点,以作删除操作
int shouldsave=0; // ?
//函数声明
char Continute(); //询问是否继续函数
void ErrorMess(); //提醒操作失误函数
void LinemanageMenu(); //航班管理子菜单
int Find_Line1(PFlight L,char *key); //航班号核对函数
int Find_Line2(PFlight L,char *key,PFlight *pp,
int *Flight_No); //按航班号查询函数
void Line_search(); //按目的地查询函数
void Line_Add(); //添加航班函数
int Line_see(); //航班查看函数
int Empty_Flight(); //航班判空函数
void bookingMenu(); //订单办理子菜单
void Display_Reserve(); //订票乘客信息
void Display_Replace(); //候补乘客信息
void RefundticketMenu();//退票办理子菜单
void CustomermagMenu();//乘客管理子菜单
char Continute() //询问是否继续
{
char answer;
while(1)
{
printf("你是否想要继续(Y/N)?\n");
scanf("%s",&answer);getchar();
if(answer=='y'||answer=='Y')
return 'y';
else if(answer=='n'||answer=='N')
return 'n';
elseprintf("输入有误,请重新输入!");
}
}
void ErrorMess() //提醒操作失误函
{
printf("\n操作有误\n");
getch();
}
int main()
{
Head=NULL;
int c;
Flight *p1=(PFlight)malloc(sizeof(Flight));
p1=Head; //p1结点指向头指针
do{
system("cls");
printf("\n\t 航空客运订票系统主菜单\n");
printf("\n************************************************\n");
printf("\t 1.航 班 管 理 菜 单 \n");
printf("\t 2.订 票 办 理 菜 单 \n");
printf("\t 3.退 票 办 理 菜 单 \n");
printf("\t 4.乘 客 管 理 菜 单 \n");
printf("\t 5.退 出 系 统 \n");
printf("\n**********谢谢使用航空客运订票系统!************\n");
printf("\n请选择你想要的服务:");
scanf("%d",&c);
switch(c)
{
case 1:LinemanageMenu();break;
case 2:bookingMenu();break;
case 3:RefundticketMenu();break;
case 4:CustomermagMenu();break;
case 5:exit(0);
default:break;
}
}while(c!=5);
} // end main
void LinemanageMenu()
{
int c;
system("cls");
while(1)
{
printf("\n\t 航班管理菜单\n");
printf("\n————————————————————————\n");
printf("\t 1.添加新航班\n");
printf("\t 2.查询航班\n");
printf("\t 3.查看航班 \n");
printf("\t 4.返回主菜单\n");
printf("\n————————————————————————\n");
printf("\n请选择你想要的服务:");
scanf("%d",&c);
switch(c)
{
case 1:Line_Add();break;
case 2:Line_search();break;
case 3:Line_see();break;
case 4:return;
default:break;
}
}
}
void Line_Add()//添加新航班函数
{
PFlight *p1; //创建航班结点指针
PFlight p=(PFlight)malloc(sizeof(Flight));
p1=&Head;
while(1)
{
if(Head==NULL){
*p1=(PFlight)malloc(sizeof(Flight));
(*p1)->Next=NULL;
p2=Head;
}//头结点初始化
else
{
*p1=p;
*p1=(PFlight)malloc(sizeof(Flight));
p2->Next=*p1;
p2=*p1;
}//添加新的结点
printf("输入终点站名:");
scanf("%s",&p2->Des_Name);
while(1) //加入while是因为想在输入错误的时候能重新输入
{ printf("输入唯一航班号:");
scanf("%s",&p2->Flight_No);
if(Find_Line1(Head, p2->Flight_No))
printf("本航班号已存在!请重新输入\n");
else break;
}
printf("输入飞机型号:");
scanf("%s",&p2->Plane_No);
while(1)
{ printf("输入航班工作日期(1-7):");
scanf("%d",&p2->Week_Day);
if(p2->Week_Day<1 || p2->Week_Day>7)
printf("输入有误,请重新输入!\n");
elsebreak;
}
printf("输入乘客座位数量:");
scanf("%d",&p2->Customer_Amount);
printf("输入头等舱的价格:");
scanf("%d",&p2->Price);
printf("输入一等舱的价格:");
scanf("%d",&p2->Price);
printf("输入二等舱的价格:");
scanf("%d",&p2->Price);
p2->Free_Amount=p2->Customer_Amount;
p2->CustName=NULL;
p2->ReplName=NULL;
if(Continute()=='n'){
p2->Next=NULL;
return;
} //end if
}//end while(1)
} //end Add
void Line_search() //根据目的地查询航班信息
{
char Desname;
int flag=0;
Flight *p1;
p1=Head;
if(Empty_Flight())return; //判断空
while(1)
{ printf("输入想到达的目的地:");
scanf("%s",&Desname);
getchar();
printf("你所查询的航班信息:\n");
printf("\n————————————————————————————————————————————————————\n");
while(p1!=NULL)
{
if(strcmp(p1->Des_Name,Desname)==0) //strcmp函数比较字符串的大小,只有相同才会返回0
{
flag=1;
cout<<"终点名 航班号 飞机型号 星期 座位数 头等舱价格 一等舱价格 二等舱价格 剩余座位\n";
cout<<p1->Des_Name<<"\t"
<<p1->Flight_No<<"\t"
<<p1->Plane_No<<"\t"
<<p1->Week_Day<<" "
<<p1->Customer_Amount<<"\t"
<<p1->Price<<"\t"
<<p1->Price<<" \t "
<<p1->Price<<"\t\t"
<<p1->Free_Amount<<"\t"
<<endl;
}
p1=p1->Next;
}
if(flag=0 && p1==NULL) //寻找到最后仍没有找到该目的地
printf("没有到达该目的地的航班!");
printf("\n————————————————————————————————————————————————————\n");
if(Continute()=='n') //询问是否继续该函数
return;
}//end while(1)
}//end search
int Line_see() //查看航班信息函数
{
Flight *p1=Head;
if(Empty_Flight()) return 0; //return 0有什么用处????
printf("你所查询的航班信息:\n");
printf("\n———————————————————————————————————————————————————————\n");
cout<<"终点名 航班号 飞机型号 星期 座位数 头等舱价格 一等舱价格 二等舱价格 剩余座位\n";
while(p1!=NULL)
{
cout<<p1->Des_Name<<"\t"
<<p1->Flight_No<<"\t"
<<p1->Plane_No<<"\t"
<<p1->Week_Day<<" "
<<p1->Customer_Amount<<"\t"
<<p1->Price<<"\t"
<<p1->Price<<"\t"
<<p1->Price<<"\t\t"
<<p1->Free_Amount<<"\t"
<<endl;
p1=p1->Next;
}
printf("\n———————————————————————————————————————————————————————\n");
printf("按任意键返回!\n");getch();
}
int Find_Line1(PFlight L,char *key) //核对航班号信息
{
int flag=0; //作为判定找到or未找到的符号
Flight *p1;
p1=L;
if(p1==p2) return flag; //首航班不作比较???
while(p1!=p2 && p1!=NULL)
{
if(strcmp(p1->Flight_No,key)==0)
{
flag=1; break;
}
p1=p1->Next;
}
return flag;
}
int Empty_Flight() //判断航班信息是否为空
{
if(Head==NULL)
{
printf("对不起,目前没有任何航班信息。按任意键返回!\n");
getch();
return 1;
}
return 0;
}
int Find_Line2(PFlight L, char *key, PFlight *pp, int *Flight_No)//按航班号查询函数
{
int flag=0;
Flight *p1;
p1=L;
while(p1!=NULL)
{ if(strcmp(p1->Flight_No,key=0))
{flag=1;*pp=p1; break;
}
p1=p1->Next;
if(p1!=NULL) Flight_No++;
}
return flag;
}
void bookingMenu()//办理订票函数
{
int Ticket_Count,IDinfor,i,flag=0;
int Flight_No=0;//记录满足条件的航班结点
Flight *p1;//记录满足条件的航班结点地址
Customer *c1;//订票乘客的结点,以便作插入操作
Customer *c2;//临时候补乘客的结点
char answer={0};//输入的航班数据
char temp,c;
int tag=0;
int IsRepl=0;
if(Empty_Flight()) return;//航班为空
while(1)
{
printf("\n\t现在您可以订票!");
flag=0;
Flight_No=0;
tag=0;
printf("\n\t请输入航班号:");
scanf("%s",answer);
if(Find_Line2(Head,answer,&p1,&Flight_No))
{
while(1)//选择1进入订票系统
{
printf("\n\t 请输入您想要订购的票的数量:");
scanf("%d",&Ticket_Count);
if(Ticket_Count==0)
{
printf("\n\t 请再次输入飞机型号:\n");
getch();
}
elsebreak;
}
if(p1->Free_Amount >= Ticket_Count)//剩余票数>=订购票数,进入订票操作
{
Customer_Count++;//订票乘客总数增1
flag=1;
IsRepl=1;
if(p1->CustName==NULL)//创建表头,建议立该航班首位乘客结点
{
Custp1=c1=(Customer*)malloc(sizeof(Customer));//malloc函数动态内存申请,让Customer*指针作乘客结构体变量
p1->CustName=Custp1;
}
else
{//建立后续乘客结点
c1=(Customer*)malloc(sizeof(Customer));
Custp1->Next=c1;
Custp1=c1;
}
IsEmpty=0;
Custp1->Amount=Ticket_Count;
IDinfor = p1->Customer_Amount-p1->Free_Amount+1;
Custp1->IDinfor = IDinfor;
p1->Free_Amount -= Ticket_Count;
printf("\n\t 请输入您的姓名");
scanf("%s",&Custp1->Name);
while(1)
{
printf("\n\t 请输入舱位等级:");
scanf("%s",&Custp1->Rank);
if(!(Custp1->Rank>='1'&&Custp1->Rank<='3'))
{
{
printf("\n\t输入有误,请重新输入!");
getch();
}
}
else
break;
}
printf("\n\t 请输入你的ID信息:");
scanf("%d",&Custp1->IDinfor);
if(Ticket_Count<10)
printf("\n\t");
else
printf("\n\t");
printf("\n\t 恭喜您订票成功!\n");
for(i=1; i<=Ticket_Count; i++)
{
printf("\n\t 您所预定的座位号是%d",IDinfor++);
if(i%10==0) printf("\n\t");
}
printf("\n");
}
else if(p1->Free_Amount==0)//剩余票数为0
{
printf("\n\t对不起,票已售完!\n"); IsRepl=0;
}
else
{
printf("\n\t对不起,当前没有多余的票!\n"); IsRepl=0;
}
if(!IsRepl)
{
printf("\n\t 您是否想成为候补乘客(Y/N)?") ;
scanf("%s",&temp);
if(temp=='y'||temp=='Y')//进入候补操作
{
if(p1->ReplName==NULL)//建立首位候补乘客结点
{
c2=(Customer*)malloc(sizeof(Customer));
Replp1=c2;
p1->ReplName = Replp1;
}
else
{
c2=(Customer*)malloc(sizeof(Customer));
Replp1->Next=c2;
Replp1 = c2;
}
IsReplace=0;//候补乘客不为空
tag=1;//已选择列入候补乘客名单
Replp1->Amount = Ticket_Count;
printf ("\n\t 请输入您的姓名:");
scanf("%s",&Replp1->Name);
Replp1->IDinfor = IDinfor;
Replp1->Amount = Ticket_Count;
while(1)
{
printf("\n\t 请输入舱位等级:");
scanf("%s",&Replp1->Rank);
printf("\n\t 请输入你的ID信息:");
scanf("%d",&Replp1->IDinfor);
if(!(Replp1->Rank>='1'&&Replp1->Rank<='3'))
{
printf("\n\t输入有误,请重新输入!");
getch();
}
else
break;
}
printf("\n\t没有剩余座位!\n");//提示候补无座
shouldsave==1;
}
}
}
else
printf("\n\t对不起,航班不存在!\n");
if(flag)//若不做处理,会地址溢出
Custp1->Next=NULL;
if(tag)//若不做处理,会地址溢出
{
Replp1->Next=NULL;
printf("\n\t 您已经成功排入候补订票队列中!\n");
}
printf("\n\t 是否退出菜单?:(Y/N)");
scanf("%s",&c);
if(c=='y') return;
}
}
void RefundticketMenu()
{
int Flight_No=0,flag=0; //满足条件的航班的订票结点
Flight *p1; //满足条件的航班的订票结点地址
Customer *c2,*c4; //临时订票乘客结点
Customer *c3,*c5; //临时候补乘客结点
char answer,name; //用户输入的航班数据
int tag=0; //*若第二乘客满足条件,则它的首地址会冲突,注意此处*
int IDinfor; //记录座位号
if(Empty_Flight()) return;//航班为空
printf("\n\t 现在开始进行退票手续");
if(IsEmpty)
{
printf("\n\t 对不起,乘客不存在!"); getch();
return;
}
while(1)
{
flag=0; tag=0; Flight_No=0;
printf("\n\t 请输入航班:");
scanf("%s",&answer);
if(Find_Line2(Head,answer,&p1,&Flight_No)) //即航班存在
{
c2=p1->CustName; //指向该航班乘客名单首地址
printf("\n\t 请输入您的姓名:");
scanf("%s",&name);
if(c2==NULL)
{
printf("\n\t 对不起,乘客不存在");
if(Continute()=='n') return; //是否继续操作
}
else
while(c2!=NULL) //查找有无该乘客名字
{
if(strcmp(c2->Name,name)==0)
{
if(c2==p1->CustName) //若为首位乘客满足
{prior=p1->CustName; //记录指针
IDinfor=c2->IDinfor;
flag=1;break;
}
}
else if(c2->Next!=NULL); //记录满足条件航班的前结点地址
{ if(strcmp(c2->Next->Name,name)==0)
{ tag=1;
prior=c2;
IDinfor=c2->Next->IDinfor;
flag=1; break;
}
}
c2 = c2->Next; //指向下一乘客结点
shouldsave = 1;
}
if(!flag)
printf("\n\t 对不起,乘客不存在!\n");
}
else printf("\n\t 对不起, 航班不存在!\n");
if(flag)
{if(prior==p1->CustName&&!tag) //首结点满足条件,则该航班订票乘客置空
{
if(prior->Next==NULL)
{ p1->Free_Amount+= prior->Amount;
p1->CustName=NULL;
}
else
{
p1->Free_Amount += prior->Next->Amount;
p1->CustName = prior->Next;
}
}
else
{
p1->Free_Amount += prior->Next->Amount;
prior->Next = prior->Next->Next;
}
Customer_Count--;
if(Customer_Count==0) IsEmpty = 1;
shouldsave=1;
}
if(flag)
{
c3=p1->ReplName;
while(c3!=NULL)
{
if(c3->Amount<=p1->Free_Amount) //候补乘客的订票数小于或等于剩余票数
{
printf("\n\t 候补乘客已经存在!\n");
c4=(Customer*)malloc(sizeof(Customer)); //分配新结点
Custp1->Next=c4;
c4->Next=NULL;
IsEmpty=0;
if(p1->CustName==NULL) p1->CustName=c4;
strcpy(c4->Name,c3->Name);
c4->Rank = c3->Rank;
c4->Amount = c3->Amount;
c4->IDinfor = IDinfor;
p1->Free_Amount -= c3->Amount;
Customer_Count++;
if(c3->Next==NULL) IsReplace=1;
if(p1->ReplName==c3)
{
if(p1->ReplName->Next==NULL)
p1->ReplName=NULL; //删除
else p1->ReplName = c3->Next;
}
}
else c5->Next=c3->Next->Next;
break;
}
if(c3->Next!=NULL)
if(c3->Next->Amount<=p1->Free_Amount)
c5=c3;
c3=c3->Next;
shouldsave=1;
}
printf("\n\t 退票成功!"); getch();
return;
}
shouldsave=1;
if(Continute()=='n') return;
}
void CustomermagMenu() //乘客管理子菜单
{
int c;
system("cls");
while(1)
{
printf("\n\t 乘客管理菜单\n");
printf("\n————————————————————————\n");
printf("\t 1.订票乘客信息\n");
printf("\t 2.候补乘客信息\n");
printf("\t 3.返回主菜单\n");
printf("\n————————————————————————\n");
printf("\n请选择你想要的服务:\n");
scanf("%d",&c);
switch(c)
{
case 1:Display_Reserve();break;
case 2:Display_Replace();break;
case 3:return;
default:break;
}
}
}
void Display_Reserve() //查看订票乘客名单
{
Flight *p1=Head;
Customer *c1;
system("cls");
if(Empty_Flight())return; //判断航班否空
printf("查看订票乘客的信息:");
if(IsEmpty) //判断有无乘客信息
{
printf("对不起,没有任何订票乘客信息。\n");
getch(); return;
}
printf("\n————————————————————————————————————————————————\n");
printf("姓名 航班号 飞机型号 订票数 目的地 座位等级身份证ID\n");
while(p1!=NULL) //进入航班链表
{
if(p1->CustName!=NULL) //当该航班乘客名单不空
{
c1=p1->CustName; //c1指向乘客名单链表
while(c1!=NULL) //当c1为查询完全部名单
{
printf("%-8s%-10s%-9s%-10d%-9s%-9s%-20d%\n",c1->Name,p1->Flight_No,p1->Plane_No,c1->Amount,
p1->Des_Name,c1->Rank,c1->IDinfor);
c1=c1->Next; //c1移至下一个乘客名单
}
if(p1->Free_Amount>=1) //判断该航班的剩余票数
printf("该航班还有多余的票\n");
else
printf("该航班票已售完\n");
}
p1=p1->Next; //p1移至下一个航班
printf("\n————————————————————————————————————————————————\n");
}//end while
printf("按任意键返回!\n");
getch();return;
}//end reserve
void Display_Replace() //查看候补乘客名单
{
Flight *p1=Head;
Customer *c1;
system("cls");
if(Empty_Flight())return; //判断航班否空
printf("查看候补乘客的信息:");
if(IsReplace) //判断有无乘客信息
{
printf("对不起,没有任何候补乘客信息。\n");
getch(); return;
}
printf("\n————————————————————————————————————————————————\n");
printf("姓名 航班号 飞机型号 订票数 目的地 座位等级身份证ID\n");
while(p1!=NULL) //进入航班链表
{
if(p1->ReplName!=NULL) //当该航班候补乘客名单不空
{
c1=p1->ReplName; //c1指向候补乘客名单链表
while(c1!=NULL) //当c1为查询完全部名单
{
printf("%-8s%-10s%-9s%-10d%-9s%-9s%-20d%\n",c1->Name,p1->Flight_No,p1->Plane_No,c1->Amount,
p1->Des_Name,c1->Rank,c1->IDinfor);
c1=c1->Next; //c1移至下一个乘客名单
}
if(p1->Free_Amount>=1) //判断该航班的剩余票数
printf("该航班还有多余的票\n");
else
printf("该航班票已售完\n");
}
p1=p1->Next; //p1移至下一个航班
printf("\n————————————————————————————————————————————————\n");
}//end while
printf("按任意键返回!\n");
getch();return;
}//end replace
本帖最后由 东瓜皮6688 于 2020-12-23 18:54 编辑
我觉得是316行那个循环开始就不行了,大神帮帮忙,我知道的就这些了 订票流程的问题,改两个地方就行。295行或附近的if(strcmp(p1->Flight_No,key=0))改成if(!strcmp(p1->Flight_No,key))。其他功能我也没有测试 添加航班那里,有点问题,如果选择“继续”的话,程序会直接停止,因为你下面没做好, 661行附近的printf("%-8s%-10s%-9s%-10d%-9s%-9s%-20d%\n",c1->Name,p1->Flight_No,p1->Plane_No,c1->Amount,p1->Des_Name,c1->Rank,c1->IDinfor);改成printf("%-8s%-10s%-9s%-10d%-9s%-9c%-20d%\n",c1->Name,p1->Flight_No,p1->Plane_No,c1->Amount,p1->Des_Name,c1->Rank,c1->IDinfor);因为你的c1->Rank是char类型,你却用了%s,会段错误的。就是候补乘客会输出不出来
页:
[1]