航班

#include<stdio.h>
#include<string.h>
#include<malloc.h>
#define maxspace 100
#define keylen 10
#define radix_n 10
#define radix_c 26
typedef char keytype;
typedef struct{
    char start[10];     //起点
    char end[10];       //终点
    char sche[10];      //班期
    char time1[10];     //起飞时间
    char time2[10];     //到达时间
    char model[10];     //机型
    int  price;         //票价
}infotype;              //航班记录类型
typedef struct{
    keytype keys[keylen];    //关键字(航班号)
    infotype others;
    int next;
}slnode;                     //静态链表接点类型
typedef struct{ 
   slnode sl[maxspace];      //静态链表,sl[0]为头结点
   int keynum;               //记录当前关键字字符个数
   int length;               //当前表长
}sllist;                     //静态链表类型


void distribute(slnode *sl,int i,int *f,int *e)
{
  int j,p;
  for(j=0;j<radix_n;j++)
  {//各子表置为空表
    f[j]=0;
    e[j]=0;
  }
  for(p=sl[0].next;p;p=sl[p].next)
  {
      j=sl[p].keys[i]%48;     //将数字字符转换成相对应的数值型数字
      if(!f[j])
          f[j]=p;
      else
          sl[e[j]].next=p;
          e[j]=p;             //将p指向的结点插入到第j个子表中
 }
}
//一趟数字字符的收集函数
void collect(slnode *sl,int *f,int *e)
{
  int j,t;
  for(j=0;!f[j];j++);      //找第一个非空子表
    sl[0].next=f[j];       //sl[0].next指向第一个非空子表中的一个结点
    t=e[j];
  while(j<radix_n-1)
  {
       for(j=j+1;j<radix_n-1&&!f[j];j++);   //找下一个非空子表
    if(f[j])
    {
        sl[t].next=f[j];
        t=e[j];
    }         //链接两个非空子表
  }
  sl[t].next=0;                         //t指向最后一个非空子表中的最后一个结点
}


void distribute_c(slnode *sl,int i,int *f,int *e)
{
   int j,p;
   for(j=0;j<radix_c;j++)
   {//各子表置为空表
      f[j]=0;
      e[j]=0;
   }
   for(p=sl[0].next;p!=0;p=sl[p].next)
   {  j=sl[p].keys[i]%65;                  //将字母字符转换成在字母集中相应的序号(0-25)
      if(!f[j])
         f[j]=p;
      else
         sl[e[j]].next=p;
         e[j]=p;
   }
}


//一趟字母字符收集
void collect_c(slnode *sl,int *f,int *e)
{
   int j,t;
   for(j=0;!f[j];j++);
     sl[0].next=f[j];t=e[j];
   while(j<radix_c-1)
   {
      for(j=j+1;j<radix_c-1 && !f[j];j++);
      if(f[j])
      {
         sl[t].next=f[j];
         t=e[j];}
   }
   sl[t].next=0;
}



//链式基数排序函数
void radixsort(sllist *l)
{
   int i;
   int fn[10],en[10];
   int fc[26],ec[26];
   for(i=0;i<l->length;i++)
      l->sl[i].next=i+1;           //0号单元仅存放指针,不存储内容
      l->sl[l->length].next=0;     //将普通的线性表改造为静态链表
   for(i=l->keynum-1;i>=2;i--)
   {
      distribute(l->sl,i,fn,en);
      collect(l->sl,fn,en);
   }
   for(i=1;i>=0;i--)
   {
     distribute_c(l->sl,i,fc,ec);
     collect_c(l->sl,fc,ec);
   }
}
//按指针链重新整理静态链表
void arrange(sllist *l)
{
  int p,q,i;
    slnode temp;
    p=l->sl[0].next;             //p指向第一个记录的当前位置
  for(i=1;i<=l->length;i++)     //L.s1[1..i-1]已按关键字有序化/
 {
    while(p<i)
      p=l->sl[p].next;           //找到第i个记录,并用p指向其在L中当前位置
      q=l->sl[p].next;           //q指向尚未调整的表尾
    if(p!=i)
    {
       temp=l->sl[p];l->sl[p]=l->sl[i];
       l->sl[i]=temp;            //交换记录
       l->sl[i].next=p;
    }
    p=q;                         //p指向尚未调整的表尾,为找第i+1个记录做准备
  }
}


int binsearch(sllist *l,keytype key[])
{
   int low,high,mid;
       low=1;high=l->length;
   while(low<=high)
   {   mid=(low+high)/2;
       if(strcmp(key,l->sl[mid].keys)==0)
       return mid;
       else if(strcmp(key,l->sl[mid].keys)<0)
            high=mid-1;
       else low=mid+1;
   }
   return 0;
}



//顺序查找函数
void seqsearch(sllist *l,keytype key[],int i)
{
   int j,k,m=0;
   void display(sllist *l,int i);
   for(j=1;j<=l->length;j++)
   {
      switch(i){
      case 2:k=strcmp(key,l->sl[j].others.start);break;     //起点站
      case 3:k=strcmp(key,l->sl[j].others.end);break;       //终点站
      case 4:k=strcmp(key,l->sl[j].others.time1);break;     //起飞时间
      case 5:k=strcmp(key,l->sl[j].others.time2);break;     //到达时间
      }
      if(k==0)
      {
        m=1;
        display(l,j);
      }
   }
   if(m==0)
     printf("无此航班信息,可能是输入错误!\n");
}


void serachcon(sllist *l)
{   int i=1;
    while(i>=1&&i<=5){
    char key[keylen];
    char ki[keylen];
    int k;
    printf("****************************\n");
    printf("*    航班信息查询系统      *\n");
    printf("****************************\n");
    printf("*       1.  航   班   号   *\n");
    printf("*       2.  起   点   站   *\n");
    printf("*       3.  终   点   站   *\n");
    printf("*       4.  起  飞 时 间   *\n");
    printf("*       5.  到  达 时 间   *\n");
    printf("*       0.  退  出 系 统   *\n");
    printf("****************************\n");
    printf("       请选择 (0-5): ");
    scanf("%d",&i);
    switch(i){
    case 1:printf("输入要查询的航班号(字母要大写):");
           scanf("%s",key);k=binsearch(l,key);
           display(l,k);
           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",ki);seqsearch(l,ki,i);
           break;
    case 5:printf("输入要查询的航班到达时间:");
           scanf("%s",ki);seqsearch(l,ki,i);
           break;
    case 0:printf("再  见!\n");
           return;
    }
    }
}




//输入航班记录函数
void inputdata(sllist *l)
{
   int i=1;
   char yn='y';
   while(yn=='y'||yn=='Y')
   { 
      printf("航班号   起点站   终点站   航班期    起飞时间   到达时间   机型   票价\n");
      scanf("%s%s%s%s%s%s%s%d",l->sl[i].keys,l->sl[i].others.start,
      l->sl[i].others.end,l->sl[i].others.sche,l->sl[i].others.time1,l->sl[i].others.time2,l->sl[i].others.model,&l->sl[i].others.price);
      i++;
      printf("要继续输入吗?y/n: ");
      scanf("%s",&yn);
 
   }
   l->length=i-1;
}



void display(sllist *l,int i)
{  if(i!=0)
{
   printf("航班号 起点站 终点站 航班期   起飞时间 到达时间 机型 票价\n");
   printf("%s,%s,%s,%s,%s,%s,%s,%d\n",l->sl[i].keys,l->sl[i].others.start,
   l->sl[i].others.end,l->sl[i].others.sche,l->sl[i].others.time1,l->sl[i].others.time2,l->sl[i].others.model,l->sl[i].others.price);
}
else  printf("无此航班信息,可能是输入错误!\n");
}



void main()
{
   sllist *l;
   l=(sllist *)malloc(sizeof(sllist));   //初始化及输入数据
   l->keynum=6;
   l->length=0;                          //输入航班记录
   inputdata(l);                         //基数排序
   radixsort(l);
   arrange(l);                           //调用查询函数
   serachcon(l);
   return;
}

 

posted @ 2012-04-21 06:46  牧涛  阅读(455)  评论(0编辑  收藏  举报