机票管理系统,订票又退票,说没有买票改怎么改,个人认为是队列指针出现问题
/*********************************************************************
程序名:
版权:
作者:
日期: 2024-06-03 18:40
说明:
*********************************************************************/
#include <iostream>
#include<stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;
typedef struct CNode {
char name[50];//乘客姓名
int num;//订票数
int rank;//客舱等级
CNode *next;
} CNode, *CList; //乘客节点
typedef struct HNode {
char name[50];//候补乘客姓名
int num;//候补票数
HNode *next;
} HNode, *HList; //候补乘客节点
typedef struct Queue {
HList front;
HList rear;
} LinkQueue;
typedef struct hangban {
char end[20];//终点
char hbid[20];//航班编号
char planeid[20];//飞机型号
char day[20];//飞行日期
int maxnum;//成员定额
int less;//总余票
int lessrank1;//一等余票
int lessrank2;//二等余票
int lessrank3;//三等余票
hangban *next;//下一个节点
CList cusLinkList;//乘客名单域,指向乘客名单链表的头指针
LinkQueue waitrank1;//候补一等队列
LinkQueue waitrank2;//候补二等队列
LinkQueue waitrank3;//候补三等队列
} hangban, hangbanNode, *Phangban;
Phangban allflight;//全局节点变量
void printfall(Phangban allflight);
void inithangban();//初始化航班
Phangban find();
void chaxun();
void dingpiao();
void tuipiao();
void addCList(CList &head, int need, char name[], int grade);
void houbu(HList &head, char name[], int need);
hangban flight1[100] = {
{ "北京", "1", "A1111", "星期一", 5, 5, 2, 2, 1},
{ "武汉", "2", "B8942", "星期三", 200, 200, 50, 100, 50},
{ "广州", "3", "C5465", "星期无", 200, 200, 50, 100, 50},
{ "福州", "4", "D5645", "星期六", 200, 200, 50, 100, 50},
{ "长沙", "5", "E4986", "星期二", 200, 200, 50, 100, 50},
{ "武汉", "6", "F6564", "星期四", 200, 200, 50, 100, 50},
{ "武汉", "7", "G1575", "星期五", 200, 200, 50, 100, 50},
{ "武汉", "8", "H6533", "星期三", 200, 200, 50, 100, 50},
{ "武汉", "9", "I4587", "星期二", 200, 200, 50, 100, 50},
{ "武汉", "10", "J8526", "星期一", 200, 200, 50, 100, 50},
{ "武汉", "11", "K2486", "星期四", 200, 200, 50, 100, 50},
{ "武汉", "12", "L4875", "星期日", 200, 200, 50, 100, 50},
{ "武汉", "13", "M9812", "星期六", 200, 200, 50, 100, 50},
{ "武汉", "14", "N1683", "星期二", 200, 200, 50, 100, 50},
};
void initCList(CList &cusLinkList) {
CList q = cusLinkList;
cusLinkList = (CNode *)malloc(sizeof(CNode));
cusLinkList->next = NULL;
}
void initQueue(LinkQueue &waitrank) {
HList p = (HList)malloc(sizeof(HNode));
if (p == NULL) {
cout << "内存不足" << endl;
exit(1);//内存不足时直接退出程序
}
p->next = NULL;
waitrank.front = waitrank.rear = p;
}
void initHList(HList &waitrank) {
HList p = waitrank;
waitrank = (HNode *)malloc(sizeof(HNode));
if (waitrank == NULL) {
cout << "内存不足" << endl;
exit(1);
}
waitrank->next = NULL;
}
void initflight() {
allflight = (hangban *)malloc (sizeof(hangban));
if (allflight == NULL)
exit(0);
allflight->next = NULL;
Phangban p = allflight, q;
for (int i = 0; i < 14; i++) {
q = (hangban *)malloc(sizeof(hangban));
if (q == NULL)
return;
//strcpy(q->begin, flight1[i].begin);
strcpy(q->end, flight1[i].end);
strcpy(q->hbid, flight1[i].hbid);
strcpy(q->planeid, flight1[i].planeid);
strcpy(q->day, flight1[i].day);
q->maxnum = flight1[i].maxnum;
q->less = flight1[i].less;
q->lessrank1 = flight1[i].lessrank1;
q->lessrank2 = flight1[i].lessrank2;
q->lessrank3 = flight1[i].lessrank3;
initCList(q->cusLinkList);
initQueue(q->waitrank1);
initQueue(q->waitrank2);
initQueue(q->waitrank3);
q->next = p->next;
p->next = q;
}
}
void printfall(Phangban allflight) {
Phangban p;
p = allflight->next;
printf("终点 航班号 飞机号 飞行日期 乘员定额 总余票 一等余 二等余 三等余\n");
while (p) {
printf("%4s %2s %5s %8s %8d %8d%8d%8d%5d\n", p->end, p->hbid, p->planeid, p->day, p->maxnum,
p->less, p->lessrank1, p->lessrank2, p->lessrank3);
p = p->next;
}
printf("\n\n");
}
void chaxun() {
char end[20];
int flag = 0;
printf("请输入终点站名:");
cin >> end;
cout << endl;
Phangban p;
p = allflight->next;
printf("终点 航班号 飞机号 飞行日期 乘员定额 总余票 一等余 二等余 三等余\n");
while (p) {
if (strcmp(end, p->end) == 0) {
flag = 1;
printf("%4s %2s %5s %8s %5d %5d %5d %5d\n", p->end, p->hbid, p->planeid, p->day,
p->maxnum, p->less, p->lessrank1, p->lessrank2, p->lessrank3);
}
p = p->next;
}
if (flag == 0)
cout << "该航班不存在!";
cout << endl << endl;
}
void houbu(HList &head, char name[], int need) {
HList q = (HNode *)malloc(sizeof(HNode));
strcpy(q->name, name);
q->num = need;
q->next = head->next;
head->next = q;
}
LinkQueue enqueue(LinkQueue &q, char name[], int need) {
HList new1 = (HNode *)malloc(sizeof(HNode));
if (new1 == NULL) {
cout << "内存不足" << endl;
exit(1);
}
strcpy(new1->name, name);
new1->num = need;
new1->next = NULL;
q.rear->next = new1;
q.rear = new1;
return q;
}
void dingpiao() {
char name[30];
char day[30];
int need, grade;
int num;
Phangban info;
info = find();
if (info == NULL) {
cout << "不存在该航班!" << endl;
return;
}
cout << "请输入您想要订的舱位等级(1/2/3):";
while (true) {
cin >> grade;
if (grade < 1 || grade > 3)
cout << "输入有误,请重新输入:";
else {
if (grade = 1)
num = info->lessrank1;
else if (grade = 2)
num = info->lessrank2;
else
num = info->lessrank3;
break;
}
}
cout << "请输入您需要订的票数:";
while (true) {
cin >> need;
if (need < 1 || need > info->less)
cout << "输入有误,请重新输入:";
else
break;
}
if (need <= num) { //余票够
for (int i = 1; i <= need; i++) {
cout << "请输入您的姓名:";
cin >> name;
CList head = info->cusLinkList;
addCList(head, 1, name, grade);
printf("%s 的座位号是:%d\n", name, info->maxnum - info->less + i);
}
info->less -= need;
if (grade == 1)
info->lessrank1 -= need;
else if (grade == 2)
info->lessrank2 -= need;
else
info->lessrank3 -= need;
cout << "订票成功" << endl;
} else {
char vis;
cout << "该舱位的余票不足,请问您是否需要候补(Y/N)" << endl;
while (true) {
cin >> vis;
if (vis != 'Y' && vis != 'N')
cout << "输入错误,请重新输入:";
else {
if (vis == 'Y') {
for (int i = 1; i <= need; i++) {
cout << "请输入您的姓名:";
cin >> name;
if (grade == 1) {
info->waitrank1 = enqueue(info->waitrank1, name, 1);
} else if (grade == 2) {
info->waitrank2 = enqueue(info->waitrank2, name, 1);
} else
info->waitrank3 = enqueue(info->waitrank3, name, 1);
cout << "排队成功!" << endl;
}
}
break;
}
}
}
}
void addCList(CList &head, int need, char name[], int grade) {
CList new1 = (CNode *)malloc(sizeof(CNode));
if (new1 == NULL) {
cout << "内存不足" << endl;
return;
}
new1->num = need;
new1->rank = grade;
new1->next = head->next;
head->next = new1;
}
Phangban find() {
char number[20];
cout << "请输入航班编号: ";
cin >> number;
Phangban p = allflight->next;
while (p) {
if (!strcmp(number, p->hbid))
return p;
p = p->next;
}
return NULL;
}
void Houbu(Phangban &info, LinkQueue &waitrank, int les, int grade) {
HList p = waitrank.front;
while (p) {
if (p->num <= les&&p->num!=0) {
printf("%s候补成功", p->name);
CList head = info->cusLinkList;
addCList(head, p->num, p->name, grade);
printf("您的座位号是:%d\n", info->maxnum - info->less + 1);
les -= p->num;
info->less -= p->num;
}
p = p->next;
}
if (grade == 1)
info->lessrank1 = les;
else if (grade == 2)
info->lessrank2 = les;
else
info->lessrank3 = les;
}
void tuipiao() {
Phangban info;
int grade;
CList p1, p2, head;
char name[20];
info = find();
if (info == NULL) {
cout << "退票失败,该航班不存在!" << endl;
}
head = info->cusLinkList;
p1 = head->next;
cout << "请输入姓名:";
cin >> name;
p2 = head;
while (p1) {
if (strcmp(name, p1->name) == 0)
break;
p2 = p1;
p1 = p1->next;
}
if (p1 == NULL) {
cout << "对不起,您没有订过票,或者输入信息有误!" << endl;
return;
} else {
grade = p1->rank;
p2->next = p1->next;
info->less += p1->num;
printf("%s 退票成功!\n", p1->name);
if (grade == 1) {
info->lessrank1 += p1->num;
Houbu(info, info->waitrank1, info->lessrank1, grade);
} else if (grade == 2) {
info->lessrank2 += p1->num;
Houbu(info, info->waitrank2, info->lessrank1, grade);
} else {
info->lessrank3 += p1->num;
Houbu(info, info->waitrank3, info->lessrank1, grade);
}
free(p1);
}
}
void menu() {
int res;
printf("\n\n");
printf(" 航空订票系统\n");
printf("***********************************************************\n");
printf(" 1. 总航班 \n");
printf(" 2. 查询航线 \n");
printf(" 3. 订票 \n");
printf(" 4. 退票 \n");
printf(" 5. 退出 \n");
printf("***********************************************************\n");
printf(" 输入需要办理的业务:");
scanf("%d", &res);
switch (res) {
case 1:
printfall(allflight);//打印全部航班信息
menu();
break;
case 2:
chaxun();//查询航班
menu();
break;
case 3:
dingpiao();//订票
menu();
break;
case 4:
tuipiao();//退票
menu();
break;
default:
exit(0);
}
}
int main() {
initflight();//初始化航班链表
menu();
return 0;
}
问题:
正常应该是退票成功。