大一新手求大神帮忙调试
源代码.rar
(3.62 KB)
#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; }