大一新手求大神帮忙调试
程序代码:#include<iostream>
#include<string.h>
#include<conio.h>
#include<windows.h>
//宏定义
#define MaxSpace 100
#define keylen 6
#define RADIX_n 10
#define RADIX_c 26
#define SHOW_MSG_ERROR
/*输入数据错误,程序终止执行!\n"*/
a
typedef char KeyType;
typedef struct
{//航班记录结构描述
char start[6]; //起点站
char end[6]; //终点站
char sche[6]; //班期
char time1[6]; //起飞时间
char time2[6]; //到达时间
char model[3]; //机型
int price; //票价
}InfoType;
typedef struct
{//关键字-静态链表结点类型
KeyType keys[keylen]; //关键字(航班号)
InfoType others;
int next;
}SLNode;
typedef struct
{//关键字序列-静态链表类型
SLNode s1[MaxSpace]; //静态链表
int keynum; //关键字字符数
int length; //表长
}SLList;
typedef int ArrType_n[RADIX_n]; //数字字符
typedef int ArrType_c[RADIX_c]; //字母字符
KeyType key[keylen],k1[4];
//功能函数声明
void Distribute(SLNode *s1, int i, ArrType_n &f, ArrType_n &e);
void Collect(SLNode *s1, int i, ArrType_n f, ArrType_n e);
void Distribute_c(SLNode *s1, int i, ArrType_c &f, ArrType_c &e);
void Collect_c(SLNode *s1, int i, ArrType_c f, ArrType_c e);
void RadixSort(SLList &L);
void Arrange(SLList &L);
int BinSearch(SLList L, KeyType key[]);
void SeqSearch(SLList L, KeyType key[],int i);
void DisplayStyle(int i, char *s);
void Display(SLList L, int i);
void searchcon(SLList L);
void Prompt();
bool InputData(SLList &L);
bool Check_HangBanHao(char *HangBanHao);
//1.数字字符分配函数
void Distribute(SLNode *s1, int i, ArrType_n &f, ArrType_n &e)
{
int j,p;
for ( j=0;j<RADIX_n;j++) f[j]=0;
for ( p=s1[0].next; p; p=s1[p].next)
{
j=s1[p].keys[i]%48; //将数字字符映射为十进制数字
if ( !f[j]) f[j]=p;
else s1[e[j] ].next=p; //将p指向的结点插入到第j个子表中
e[j]=p;
}
}
//2.数字字符收集函数
void Collect(SLNode *s1, ArrType_n f, ArrType_n e)
{
int j,t;
for ( j=0;!f[j];j++); //找第一个非空子表
s1[0].next=f[j]; //将s1[0].next指向第一个非空子表的第一个结点
t=e[j];
while ( j<RADIX_n-1)
{
for (j=j+1;j<RADIX_n-1 && !f[j]; j++);//找下一个非空子表
if ( f[j]) s1[t].next=f[j]; t=e[j]; //链接到主链表
}
s1[t].next=0;
}
//3.字母字符分配函数
void Distribute_c(SLNode *s1, int i, ArrType_c &f, ArrType_c &e)
{
int j,p;
for ( j=0; j<RADIX_c; j++)
f[j]=0;
for (p=s1[0].next; p!=0; p=s1[p].next)
{
j=s1[p].keys[i]%65; //将字母字符映射为字母集中的相应序号
if ( !f[j]) f[j]=p;
else s1[e[j]].next=p; //将p指向的结点插入到第j个子表中
e[j]=p;
}
}
//4.字母字符收集函数
void Collect_c(SLNode *s1, ArrType_c f, ArrType_c e)
{
int j,t;
for (j=0;!f[j];j++); //找第一个非空子表
s1[0].next=f[j]; t=e[j]; //将s1[0].next指向第一个非空子表的第一个结点
while ( j<RADIX_c-1)
{
for (j=j+1; j<RADIX_c-1 && !f[j]; j++);//找下一个非空子表
if ( f[j]) s1[t].next=f[j]; t=e[j]; //链接到主链表
}
s1[t].next=0;
}
//5.链式基数排序函数
void RadixSort(SLList &L)
{
int i;
ArrType_n fn, en;
ArrType_c fc, ec;
for ( i=0; i<L.length; i++) //将线性表改造为静态链表
L.s1[i].next=i+1;
L.s1[L.length].next=0; //"0"表示空指针
//按最低位优先依次对关键字进行分配和收集
for ( i=L.keynum-1; i>=2;i--) //对低4位数字部分进行分配和收集
{
Distribute(L.s1,i,fn,en);
Collect(L.s1,fn,en);
}
for (i=1;i>=0;i--) //对高位2位字母进行分配和收集
{
Distribute_c(L.s1,i,fc,ec);
Collect_c(L.s1,fc,ec);
}
}
//6.按指针链整理线性表
void Arrange(SLList &L)
{
int p,q,i;
SLNode temp;
p=L.s1[0].next; //p指向第一个结点
for ( i=1;i<L.length;i++)
{
while (p<i) //查找第i个结点,并用p指向此结点
p=L.s1[p].next;
q=L.s1[p].next;
if (p!=i) //若第i个结点不在当前位置,交换节点数据
{
temp=L.s1[p];
L.s1[p]=L.s1[i];
L.s1[i]=temp;
L.s1[i].next=p;
}
p=q; //p指向下一个未调整结点
}
}
//7.折半查找函数
int BinSearch(SLList L, KeyType key[ ]) //源代码参见:8.3.4 详细设计2.(3)
{ //折半查找函数。在有序表L中查找关键字为key[]的记录
int high, low, mid; //上下界和中值
low=1; //下界初始化为1
high=L.length; //上界初始化为表长
while ( low<=high) //辨别查找区间
{
mid=(low+high)/2; //计算中值
if (strcmp(key,L.s1[mid].keys)==0) //若正好等于中值
return mid; //查找成功,返回中值
else if (strcmp(key,L.s1[mid].keys)<0) //在中值左边
high=mid-1; //调整上界,调整查找区间
else //在中值右边
low=mid+1; //调整下界,调整查找区间
}
return 0; //查找失败,返回0
}
//8.顺序查找函数
void SeqSearch(SLList L, KeyType key[],int i)//源代码参见:8.3.4 详细设计2.(3)
{//顺序查找函数,在有序表L中查找关键字位Key[]的记录
int j,k,m=0;
for(j=1;j<=L.length;j++)
{
switch(i) //按不同关键字查找
{
case 2: k=strcmp(key,L.s1[j].others.start); break;
//按顺序依次调用strcmp函数进行比较
case 3: k=strcmp(key,L.s1[j].others.end); break;
//按顺序依次调用strcmp函数进行比较
case 4: k=strcmp(key,L.s1[j].others.time1); break;
//按顺序依次调用strcmp函数进行比较
case 5: k=strcmp(key,L.s1[j].others.time2); break;
//按顺序依次调用strcmp函数进行比较
}
if(k==0)
{ //查找成功
m=1; //查找标识置为1
Display(L,j); //显示查找结果
}
}
if(m==0)
//查找失败
printf("很抱歉,无此航班信息.\n"); //输出提示信息
}
//9.打印班次信息函数
void Display (SLList L, int i) //源代码参见:8.3.4 详细设计2.(4)
{
printf("航班号 起点站 终点站 航班期 起飞时间 到达时间 机型 票价\n");
DisplayStyle(6,L.s1[i].keys);DisplayStyle(7,L.s1[i].others.start);
//控制对齐输出
DisplayStyle(7,L.s1[i].others.end);DisplayStyle(7,L.s1[i].others.sche);
//控制对齐输出
DisplayStyle(9,L.s1[i].others.time1);DisplayStyle(9,L.s1[i].others.time2);
//控制对齐输出
DisplayStyle(5,L.s1[i].others.model);printf("%6d\n",L.s1[i].others.price);
//控制对齐输出
printf( "\n");
}
//10.调整对齐格式函数
void DisplayStyle(int i, char *s) //源代码参见:8.3.4 详细设计2.(4)
{//调整格式函数。调整表列对齐
int j;
i-=strlen(s);
for(j=0;j<i; ++j) printf(" "); //输出占位空格,以便对齐
printf ( "%s,", s);
}
//11.查找交互界面函数
void searchcon(SLList L) //源代码参见:8.3.4 详细设计2.(3)
{
int i=1,k;
while(i>=1&&i<=6)
{
printf("\n请选择命令代号(0……6):");
scanf("%d",&i);
switch(i)
{
case 1:
printf("输入要查询的航班号(字母要大写):");
scanf("%s,key");k=BinSearch(L,key);
if(k) Display(L,k);
else printf("很抱歉,无此航班的信息。\n");
break;
case 2:
printf("输入要查询的航班起点站名:");
scanf("%s",key);SeqSearch(L,key,i);
break;
case 3:
printf("输入要查询的航班终点站名:");
scanf("%s",key);SeqSearch(L,key,i);
break;
case 4:
printf("输入要查询的航班起飞时间:");
scanf("%s",k1);SeqSearch(L,k1,i);
break;
case 5:
printf("输入要查询的航班到达时间:");
scanf("%s",k1);SeqSearch(L,k1,i);
break;
case 6:
printf("请依次录入航班信息数据:\n");
InputData(L);
break;
case 0:
exit(0);
}
Prompt(); //循环显示主菜单
}
}
//12.显示主菜单函数
void Prompt()
{
printf( "******************************************\n");
printf( " * 航班信息查询与检索系统 *\n");
printf( " * 1.按航班号查询 *\n");
printf( " * 2.按起点站查询 *\n");
printf( " * 3.按终点站查询 *\n");
printf( " * 4.按起飞时间查询 *\n");
printf( " * 5.按到达时间查询 *\n");
printf( " * 6.添加班次 *\n");
printf( " * 0.退出系统 *\n");
printf( "******************************************\n");
}
//13.输入航班记录函数
bool InputData(SLList &L) //源代码参见:8.3.4 详细设计2.(2)
{
int i=++L.length;
char yn='y';
printf("\n请依次录入航班信息数据(航班号由2位大写字母和4位数字组成):");
do
{
printf("\n航班号 起始站 终点站 航班期 起飞时间 到达时间 机型 票价 \n");
scanf ("%s%s%s%s%s%s%s%d", L.s1[i].keys, L.s1[i].others.start, L.s1[i].others.end,
L.s1[i].others.sche, L.s1[i].others.time1, L.s1[i].others.time2,
L.s1[i].others.model, &L.s1[i].others.price);
fflush(stdin); //清空输入缓冲区
if( !Check_HangBanHao(L.s1[i].keys)) return false;
++i;
printf( "继续输入吗? y/n: ");
}while ( (yn=getche())=='y' || yn=='Y');
printf( "\n");
L.length= i-1;
RadixSort(L);
Arrange(L);
return true;
}
//14.航班号输入格式校验函数
bool Check_HangBanHao(char *HangBanHao) //源代码参见:8.3.4 详细设计2.(2)
{//航班号输入格式校验函数
if(strlen(HangBanHao) !=6) return false; //航班号必须为6位
else if(HangBanHao[0]<'A'||HangBanHao[0]>'Z' ||HangBanHao[1]<'A'||HangBanHao[1]>'Z')
return false; //1-2位须为大写字母
for ( int i=2; i<=5; i++)
if (HangBanHao[i]<'0' || HangBanHao[i]>'9')
return false; //3-6位须为数字
return true;
}
//15.主函数
int main()
{
SLList L;
L.keynum=6; L.length=0; //初始化
Prompt(); //显示主菜单
if ( !InputData(L)) //信息录入,并做输入校验
{
printf (" SHOW_MSG_ERROR");
return 1;
}
searchcon(L); //执行相关查询
return 0;
}








