求帮助,数据结构程序运行有问题
题目:(一)试设计一个航空客运定票系统。基本要求如下:1、 每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。
2、 系统能实现的操作和功能如下:
1) 查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;
2) 承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。若需要,可登记排队候补;
3) 承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
3、 实现提示:两个客户名单可分别由线性表和队列实现。为查找方便,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。由于预约人数无法预计,队列也应以链表作为存储结构。
创建链表,队列
查找链表,队列插入,删除
下面是我自己写的程序:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct FLIGHT
{
char end[10];//终点站
int number;//航班号
char id[10];//飞机号
int date;//航班日期
int menber;//飞机票定额
int rest;//飞机票余额
FLIGHT *next;
}flight;
typedef struct CUSTOM
{
char name[10];
int number;//航班号
int count;//订票数量
int rank;//舱位等级
CUSTOM *next;
}custom;
typedef struct WAIT
{
char name[10];
int count;
int number;
WAIT *next;
}wait;
flight * createnohead1() //创建第一个结构体的链表
{
FLIGHT *head1,*tail,*p;
char end[10],id[10];
int number,date,menber,rest;
head1=tail=NULL;
printf("请输入链表的初始数据:航班号,终点站,飞机号,航班日期,飞机票定额,余票(以-1结束)\n");
scanf("%d",&number);
scanf("%s",end);
scanf("%s",id);
scanf("%d",&date);
scanf("%d",&menber);
scanf("%d",&rest);
printf("\n");
while(number!=-1) //输入数据加入链表尾部
{
p=( FLIGHT *)malloc(sizeof(FLIGHT));
if(p==NULL)
{
printf("Malloc Failure\n");
return NULL;
}
p->number=number;
strcpy(p->end,end);
strcpy(p->id,id);
p->date=date;
p->menber=menber;
p->rest=rest;
p->next=NULL;
if(head1==NULL)
head1=p;
else
tail->next=p;
tail=p;
scanf("%d",&number);
scanf("%s",end);
scanf("%s",id);
scanf("%d",&date);
scanf("%d",&menber);
scanf("%d",&rest);
printf("\n");
}
return head1;
}
custom * createnohead2 () //创建第二个结构体的链表
{
custom *head2,*tail,*p;
char name[10];
int number,count,rank;
head2=tail=NULL;
printf("请输入链表的初始数据:航班号,姓名,订票数量,舱位等级(以-1结束)\n");
scanf("%d",&number);
scanf("%s",name);
scanf("%d",&count);
scanf("%d",&rank);
printf("\n");
while(number!=-1) //输入数据加入链表尾部
{
p=( custom *)malloc(sizeof(custom));
if(p==NULL)
{
printf("Malloc Failure\n");
return NULL;
}
p->number=number;
strcpy(p->name,name);
p->count=count;
p->rank=rank;
p->next=NULL;
if(head2==NULL)
head2=p;
else
tail->next=p;
tail=p;
scanf("%d",&number);
scanf("%s",name);
scanf("%d",&count);
scanf("%d",rank);
printf("\n");
}
return head2;
}
wait * createnohead3 () //创建第三个结构体的链表
{
wait *head3,*tail,*p;
char name[10];
int number,count;
head3=tail=NULL;
printf("请输入链表的初始数据:航班号,姓名,订票数量(以-1结束)\n");
scanf("%d",&number);
scanf("%s",name);
scanf("%d",&count);
printf("\n");
while(number!=-1) //输入数据加入链表尾部
{
p=( wait *)malloc(sizeof(wait));
if(p==NULL)
{
printf("Malloc Failure\n");
return NULL;
}
p->number=number;
strcpy(p->name,name);
p->count=count;
p->next=NULL;
if(head3==NULL)
head3=p;
else
tail->next=p;
tail=p;
scanf("%d",&number);
scanf("%s",name);
scanf("%d",&count);
printf("\n");
}
return head3;
}
custom * insert(custom *head2,char name[10],int number,int count,int rank)
{
custom *tail,*p;
p=(custom *)malloc(sizeof(custom));
if (p==NULL)
{ printf("memory allocate error");
exit(1);
}
strcpy(p->name,name);
p->number=number;
p->count=count;
p->rank=rank;
p->next=NULL;
if(head2==NULL) return p;
tail=head2;
while(tail->next)
{
tail=tail->next;
}
tail->next=p;
printf("%d",head2->rank);
return head2;
}
wait * winsert(wait *head3,char name[10],int number,int count)
{
wait *tail,*p;
p=(wait *)malloc(sizeof(wait));
if (p==NULL)
{ printf("memory allocate error");
exit(1);
}
strcpy(p->name,name);
p->number=number;
p->count=count;
p->next=NULL;
if(head3==NULL) return p;
tail=head3;
while(tail->next)
{
tail=tail->next;
}
tail->next=p;
return head3;
}
wait * zdelete( wait *head3, int pos) //&表示引用传递
{
wait *p,*q;
int i=1;
if(head3==NULL||pos<=0)
{
return head3;
}
p=head3;
q=head3;
while(q->next&&i<pos)
{
p=q;
q=q->next;
i++;
}
if(i<pos){
return head3;}
if(q==head3) //只有一个节点
head3=NULL;
else
p->next=q->next;
free(q);
return head3;
}
custom * Delete( custom *head2, int pos) //&表示引用传递
{
custom *p,*q;
int i=1;
if(head2==NULL||pos<=0)
{
return head2;
}
p=head2;
q=head2;
while(q->next&&i<pos)
{
p=q;
q=q->next;
i++;
}
if(i<pos){
return head2;}
if(q==head2) //只有一个节点
head2=NULL;
else
p->next=q->next;
free(q);
return head2;
}
void search()
{
flight *head1;
char end[10];
int date;
flight *q;
q=head1;
scanf("%s %d",end,&date);
printf("有以下航线:");
printf("\n");
while(head1)
{
if(strcmp(head1->end,end)==0)
printf("%d %s &d\n",head1->number,head1->id,head1->date);
head1=head1->next;
}
printf("最近一天的航班:");
printf("\n");
while(q)
{
if(strcmp(q->end,end)==0)
{
if(q->date==date)
printf("%d %s &d\n",q->number,head1->id,q->date);
}
q=q->next;
}
}
void book()
{
flight *head1;
custom *head2;
wait *head3;
char str[5];
char name[10];
int number;
int count;
int rank;
scanf("%s %d %d %d",name,&number,&count,&rank);
while(head1)
{
if(head1->number==number&&head1->rest==count)
{
insert(head2,name,number,count,rank);
head1->rest=head1->rest-count;
}
else
{
printf("是否要排队候补?");
scanf("%s",str);
if(strcmp(str,"yes")==0)
{
winsert(head3,name,number,count);
}
else
break;
}
head1=head1->next;
}
}
void refund()
{
flight *head1;
custom *head2;
wait *head3;
int i=0,j=0;
int date;
int number;
char name[10];
scanf("%d %d %s",&date,&number,name);
while(head2)//退票遍历已订票的客户,然后删除
{
i++;
if(strcpy(head2->name,name)==0&&head2->number==number)
{
Delete(head2,i);
while(head1)
{
if(head1->number==number&&head1->date==date)
{
head1->rest=head1->rest+head2->count;
break;
}
head1=head1->next;
}
break;
}
head2=head2->next;
}
printf("退票完成。");
while(head3)//遍历候补客户,有的然后完成候补,然后删除
{
j++;
if(head3->number==number)
{
zdelete(head3,j);
while(head1)
{
if(head1->number==head3->number)
{
head1->rest=head1->rest+head3->count;
break;
}
head1=head1->next;
}
break;
}
head3=head3->next;
}
}
void main()
{
int i;
createnohead1();
createnohead2();
createnohead3();
printf("*****************************请选择服务*****************************\n");
printf("1.查询航班 2.预订机票 3.退票服务 4.退出服务\n");
printf("*********************************************************************\n");
scanf("%d",&i);
switch(i){
case 1:search();//查询函数
break;
case 2:book();//预定函数
break;
case 3:refund();//退票
break;
case 4:break;
defult:printf("输入有误");break;
}
printf("欢迎下次使用!");
}
输入第一组数据:
1001 beijing plane1 21 100 50
1002 shanghai plane2 22 100 40
1003 tianjin plane3 23 100 30
-1 guangzhou plane4 100 60
这个行的,接着输入第二组数据就有问题了:
1001 any 50 3
1002 black 60 2
然后就不能运行了
编译也没错误,到底哪里错了,求助,给个提示也好