航空订票系统航线录入问题:航线加一了但是内容是乱码 希望得到具体代码的改进

img

img


新航线信息没存进去,虽然航线加一了但是内容是乱码


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 7 //定义初始航线量的最大值(可改)
#define size 10

int t;

typedef struct ord_ros//已订票客户名单
{
    char name[size];//客户姓名
    int order_amount;//订票量
    int IdNumber;//身份ID
    struct ord_ros *next;
}linklist ,*Ordlist;
linklist *NEW,*p1,*head;

typedef struct Wait//候补队列乘客信息
{
    char Wait_name[size];//姓名
    int Wait_amount;//预定的票量
    int Wait_IdNumber; //身份ID
    struct Wait *next;
} WaitQNode, *PWait;


typedef struct Queue //候补队列
{
    PWait front;//等候替补客户名单域的头指针
    PWait rear;//等候替补客户名单域的尾指针
} LinkQueue;



typedef struct Waitp//用于候补客户出队时返回信息
{
    char Waitp_name[size];//姓名
    int Waitp_amount;//订票量
    int Waitp_IdNumber; //身份ID
} Waitp;

typedef struct airline  //结构体指针
{
    char terminal_name[size];//终点站名
    char air_Numer[size];//航班号
    char plane_Numer[size];//飞机号
    char day[100];//飞行日期
    int ticket_price; //机票价格
    int Sum_Ticket_Numer;//总位置
    int ticket_sur;//余票量
    airline *next;
    linklist *order;//乘员名单域,指向乘员名单链表的头指针
    LinkQueue waitQueue;//候补客户名单域,指向一个队列
}lineinfo,LINEINFO;
lineinfo *start;



int main();


void display(lineinfo *info)//打印每条航线的基本信息
{
    printf("\n%6s\t\t%3s\t%s\t%s\t%5d\t\t%4d\t%4d",info->terminal_name,info->air_Numer,info->plane_Numer,info->day,info->ticket_price,info->Sum_Ticket_Numer,info->ticket_sur);
}

linklist *insertlink(linklist *head,int amount,char name[],int IdNumber)//增加订票乘员名单域的客户信息
{
    linklist *p1,*NEW;
    p1=head;
    NEW=(linklist *)malloc(sizeof(linklist));
    if(!NEW)
    {
        printf("\n错误!!\n");
        return NULL;
    }
    strcpy(NEW->name,name);
    NEW->order_amount=amount;
    NEW->IdNumber=IdNumber;
    NEW->next=NULL;
    if(head==NULL) //若原无订票客户信息
    {
        head=NEW;
        NEW->next=NULL;
    }
    else
        head=NEW;
    NEW->next=p1;
    return head;
}

int InitQueue(LinkQueue &q) //初始化队列

{
    WaitQNode *p;
    p=(WaitQNode *)malloc(sizeof(WaitQNode));
    if (p==NULL)
    {
        printf("内存不足\n");
        return 0;
    }
    p->next=NULL;
    q.front=q.rear=p;
    return 1;
}

LinkQueue APPendQueue(LinkQueue &head,int amount,char name[],int IdNumber)//增加候补乘员名单域的客户信息
{
    WaitQNode *NEW;
    NEW=(WaitQNode *)malloc(sizeof(WaitQNode));
    strcpy(NEW->Wait_name,name);
    NEW->Wait_amount=amount;
    NEW->Wait_IdNumber=IdNumber;
    NEW->next=NULL;
    if(head.front==NULL)
    {
        head.front=NEW;
        head.rear=NEW;
        head.front->next=NEW;
        return head;
    }
    else
    {
        head.rear->next=NEW;
        head.rear=NEW;
        return head;
    }

}

int QueueDelete(LinkQueue &q,Waitp &p)//出队函数
{
    WaitQNode *t;
    t=q.front->next;
    if(q.front==NULL)//队列为空
    {
        return 0;
    }
    q.front->next=t->next;
    if(q.front->next==NULL)//出队到队列为空
    {
        q.rear=q.front;
    }
    p.Waitp_amount=t->Wait_amount;
    p.Waitp_IdNumber=t->Wait_IdNumber;
    strcpy(p.Waitp_name,t->Wait_name);
    free(t);
    return 1;
}

struct airline *find()//根据系统提出的航班号查询并以指针形式返回
{
    lineinfo *info;
    char number[10];
    int i=0;
    info=start;
    printf("请输入航班号:");
    scanf("%s",number);
    for(i=0; i<MAXSIZE; i++)
    {
        if(!strcmp(number,info->air_Numer))
            return info;
        info++;
    }
    printf("对不起,该航线末找到!\n");
    return NULL;
}
void list(int t)//打印全部航线信息
{
    lineinfo *info;
    info=start;//指针对接赋值
    int i;
    printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
    for(i=0; i<t+MAXSIZE; i++) //循环自增调用输出
        display(info++);
    printf("\n\n");
}

void prtlink()//打印订票乘员名单域的客户名单信息
{
    linklist *p;//定义一个指向客户信息结构体的指针
    struct airline *info;
    info=find();//调用find函数得到关于用户所输入航线信息的指针
    p=info->order;//将乘员名单域指向乘员名单链表的头指针和p对接
    if(p!=NULL)//判断是否为空
    {
        printf("客户姓名   订票数额   身份ID\n");
        while(p)//在p指空前循环输出
        {
            printf("%s\t\t%d\t%d\n",p->name,p->order_amount,p->IdNumber);
            p=p->next;
        }
    }
    else
        printf("该航线没有客户信息!!\n");
}


void search()//根据客户提出的终点站名输出航线信息
{
    struct airline *info,*find();
    char name[10];
    int i=0;
    info=start;//指针对接
    printf("请输入终点站名:");
    scanf("%s",name);
    while(i<MAXSIZE)
    {
        if(!strcmp(name,info->terminal_name)) //利用strcmp比较用户输入的站名和结构体数组中的站名是否一致
            break;
        info++;//若不相同则下一个,直至i>=MAXSIZE
        i++;
    }
    if(i>=MAXSIZE)//若全部访问完无相应信息
        printf("对不起,该航线未找到!\n");
    else
    {
        printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量\n");
        display(info);//调用输出
    }
    printf("\n");
}



void order()//办理订票业务
{
    printf("当前航线信息如下:\n");
    list(t);
    struct airline *info;
    int amount,IdNumber;
    char name[10];
    info=start;
    if(!(info=find())) return;//根据客户提供的航班号进行查询如为空退出该模块
    printf("请输入你所需要的订票数量:");
    scanf("%d",&amount);
    if(amount>info->Sum_Ticket_Numer)//若客户订票额超过乘员定票总额退出
    {
        printf("\n对不起您输入的票的数量已经超过乘员定额!");
        return;
    }
    if(amount<=info->ticket_sur)//若客户订票额末超过余票量订票成功并等记信息
    {
        printf("请输入您的订票客户姓名:");
        scanf("%s",name);
        printf("请输入%s的电话号码:",name);
        scanf("%d",&IdNumber);//利用整数最大值来进行加密操作代表ID
        info->order=insertlink(info->order,amount,name,IdNumber);//在订票乘员名单域中添加客户信息
        int i;
        for(i=0; i<amount; i++) //依次输出该订票客户的座位号
            printf("%s的座位号是:%d\n",name,info->Sum_Ticket_Numer-info->ticket_sur+i+1);
        info->ticket_sur-=amount;//该航线的余票量应减掉该客户的订票量
        printf("\n祝您乘坐愉快\n");
        return;
    }
    if(amount!=0&&amount>info->ticket_sur)//余票量不足,询问是否改变计划或候补
    {
        printf("剩余票数不足,是否改变订票计划?(Y/N)\n");
        char a;
        getchar();
        scanf("%c",&a);
        if(a=='Y'||a=='y')//改变订票计划
        {
            order();
        }
        if(a=='N'||a=='n')//不改变订票计划
        {
            printf("已无多余票量,是否进行排队候补?(Y/N)\n");
            char b;
            getchar();
            scanf("%c",&b);
            if(b=='Y'||b=='y')//同意候补
            {
                printf("请输入姓名(候补):");
                scanf("%s",name);
                printf("请输入电话号码(候补):");
                scanf("%d",&IdNumber);
                info->waitQueue=APPendQueue(info->waitQueue,amount,name,IdNumber);
                printf("\n候补成功!\n");
            }
        }
    }
    else
        printf("\n欢迎您下次再次订购\n");
}
void return_tkt()//退票
{
    struct airline *info;
    linklist *p1,*p2,*head;
    char cusname[10];
    int num;
    if(!(info=find())) //调用查询函数根据客户提供的航线进行搜索
        return;
    head=info->order;
    p1=head;
    printf("请输入退票客户的姓名:");
    scanf("%s",cusname);
    printf("请输入退票数量:");
    scanf("%d",&num);
    while(p1!=NULL)//根据客户提供的姓名到订票客户名单域进行查询
    {
        if(!strcmp(cusname,p1->name))
            break;
        p2=p1;
        p1=p1->next;
    }
    if(p1==NULL)
    {
        printf("对不起你没有订过票!\n"); //若未找到退出本模块
        return;
    }
    else//若信息查询成功删除订票客户名单域中的信息
    {
        if(num>p1->order_amount)//退票数量大于订票数量
        {
            printf("退票数量错误!");
            return_tkt();
        }
        if(num==p1->order_amount)
        {
            p2->next=p1->next;
            info->ticket_sur+=p1->order_amount;
            free(p1);
            printf("退票成功!!\n");
        }

        if(num<p1->order_amount)
        {
            p1->order_amount=p1->order_amount-num;
            info->ticket_sur=info->ticket_sur+num;
            printf("退票成功!!\n");
        }
    }
    LinkQueue q=info->waitQueue;
    Waitp p={0,0,0};
    if(q.front!=NULL)
        {
    int m=1;
    while(m)
    {
        int k;
        if(q.front->Wait_amount<=info->ticket_sur&&info->ticket_sur>=0)
        {

            k=p.Waitp_amount;
            QueueDelete(info->waitQueue,p);
            int i;
            for(i=0;i<p.Waitp_amount&&info->ticket_sur>0;i++)
            {
                printf("%s候补订票成功,座位号是%d\n",p.Waitp_name,(info->ticket_sur)-i);
                info->ticket_sur=info->ticket_sur-1;
                k=k-1;
            }
            //info->ticket_sur-=p.Waitp_amount;//余票量减少
            info->order=insertlink(info->order,p.Waitp_amount,p.Waitp_name,p.Waitp_IdNumber);//增加已订票客户信息
        }
        if(k<=0)
            m=0;
    }
    }
}

int check(lineinfo *line,char air_Numer[])
{
    lineinfo *p=line;
    while(p!=NULL)
    {
        if(!strcmp(air_Numer,p->air_Numer))
            return 0;
        p=p->next;
    }
    return 1;
}


int enter()//增加航班
{
   //struct airline *Airline;
   LINEINFO *q;//新航班结点指针的形参
   lineinfo *p=start;
   int m=1,t=1,i;
   while(m!=0)
   {
       q=(LINEINFO *)malloc(sizeof(LINEINFO));
       if(q==NULL)
        return 0;
       printf("请输入航班号:");
       scanf("%s",q->air_Numer);
       int s;
       s=check(start,q->air_Numer);
       if(s==0)
       {
           printf("该航班号已存在!");
           continue;
       }
       printf("请输入飞行日期:");
       scanf("%s",q->day);
       printf("请输入终点站名:");
       scanf("%s",q->terminal_name);
       printf("请输入飞机号:");
       scanf("%s",q->plane_Numer);
       printf("请输入机票价格:");
       scanf("%d",&q->ticket_price);
       printf("请输入总位置:");
       scanf("%d",&q->Sum_Ticket_Numer);
       printf("请输入余票量:");
       scanf("%d",&q->ticket_sur);

       InitQueue(q->waitQueue);//初始化该航线的候补队列信息

       q->next=p->next;
       p->next=q;
       printf("是否继续录入航线信息(输入除0外任意数字继续):");
       scanf("%d",&m);
       if(m!=0)
        t++;
   }
   printf("终点站名\t航班号\t飞机号\t\t飞行日期\t\t\t航班票价\t总位置\t余票量");
   for(i=0;i<t+MAXSIZE;i++)
   {
       display(p);
       p++;
   }
   return t;
}


int menu_select()//菜单界面
{
    int c;
    printf("\n");
    printf("\t\t航空客运订票系统\n");
    printf("=============================================\n");
    printf("=========== 1.浏览航线信息:      ============\n");
    printf("=========== 2.浏览已订票客户信息:============\n");
    printf("=========== 3.查询航线           ============\n");
    printf("=========== 4.办理订票业务:      ============\n");
    printf("=========== 5.办理退票业务:      ============\n");
    printf("=========== 6.增加航班信息:      ============\n");
    printf("=========== 7.退出系统           ============\n");
    printf("=============================================\n");
    do
    {
        printf("请选择:");
        scanf("%d",&c);
    }
    while(c<0||c>7);
    return c;
}
int main(void)
{
    struct airline air_info[MAXSIZE]=  //结构体数组指针(可增删)
    {
        {"北京","K12312","B8571","         星期一                   ",509,100,100},
        {"上海","D24322","S1002","         星期二                   ",529,100,100},
        {"伦敦","K35234","L1003","         星期三                   ",642,100,100},
        {"杭州","D42414","B9571","         星期四                   ",322,100,100},
        {"武汉","K12314","B3451","         星期五                   ",562,100,100},
        {"广州","K64124","C3451","         星期六                   ",645,100,100},
        {"美国","H12412","M3451","         星期日                   ",685,100,100}
    };
    start=air_info;
    int t;
    while(1)
    {
        switch(menu_select())
        {
        case 1:
            list(t);
            break;
        case 2:
            prtlink();
            break;
        case 3:
            search();
            break;
        case 4:
            order();
            break;
        case 5:
            return_tkt();
            break;
        case 6:
            t=enter();
            printf("t值为%d",t);
            break;
        case 7:
            printf("\n下次再见\n");
            return 0;
        }
    }
}