zoukankan      html  css  js  c++  java
  • 航班

    #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;
    }
  • 相关阅读:
    如何打开肉鸡的3389端口(xp的)
    XP鲜为人知的实用技巧(一)
    利用Ms08067工具进行溢出攻击
    教你建一个别人看不到打不开的文件夹
    在IE上显示自己的名字
    QQ使用的七大非常规秘籍
    第五篇:Python函数基础篇
    Centos7之Systemd(Service文件)详解
    Linux GCC make文件的写法3
    DSP/BIOS学习笔记——2.SWI
  • 原文地址:https://www.cnblogs.com/superjt/p/2460968.html
Copyright © 2011-2022 走看看