2301_81829019 2024-06-04 10:28 采纳率: 66.7%
浏览 6
已结题

飞机机票退票,队列信息检测不到

机票管理系统,订票又退票,说没有买票改怎么改,个人认为是队列指针出现问题

/*********************************************************************
    程序名:
    版权:
    作者:
    日期: 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;
}



问题:

img


正常应该是退票成功。

  • 写回答

3条回答 默认 最新

  • 关注

    订票时没把名字拷进去。。。

    img

    另外这里也错了:

    img

    内存不足没退出

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月4日
  • 已采纳回答 6月4日
  • 创建了问题 6月4日

悬赏问题

  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码