第16周项目4-英文单词的基数排序

来源:互联网 发布:c语言头文件内容 编辑:程序博客网 时间:2024/04/29 23:06
Copyright (c)2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名称:项目4.cbp * 作    者:王婧* 完成日期:2016年12月15
* 版 本 号:v1.0  * 问题描述:设计一个基数排序的算法,将一组英文单词,按字典顺序排列。假设单词均由小写字母或空格构成,最长的单词有MaxLen个字母。  * 输入描述:无 * 程序输出:测试数据 
#include <stdio.h>  #include <malloc.h>  #include <string.h>  #define MaxLen 9                //单词的最大长度  #define Radix  27               //基数rd为27,分别对应' ','a',…'z'  typedef char String[MaxLen+1];  //定义String为字符数组类型  typedef struct node  {      String word;      struct node *next;  } LinkNode;  void DispWord(String R[],int n) //输出单词  {      int i;      printf("  ");      for (i=0; i<n; i++)          printf("[%s] ",R[i]);      printf("\n");  }  void PreProcess(String R[],int n)  //对单词进行预处理,用空格填充尾部至MaxLen长  {      int i,j;      for (i=0; i<n; i++)      {          if (strlen(R[i])<MaxLen)          {              for (j=strlen(R[i]); j<MaxLen; j++)                  R[i][j]=' ';              R[i][j]='\0';          }      }  }  void EndProcess(String R[],int n)  //恢复处理,删除预处理时填充的尾部空格  {      int i,j;      for (i=0; i<n; i++)      {          for (j=MaxLen-1; R[i][j]==' '; j--);          R[i][j+1]='\0';      }  }  void Distribute(String R[],LinkNode *head[],LinkNode *tail[],int j,int n)  //按关键字的第j个分量进行分配,进入此过程时各队列一定为空  {      int i,k;      LinkNode *p;      for (i=0; i<n; i++)         //依次扫描R[i],将其入队      {          if (R[i][j]==' ')       //空格时放入0号队列中,'a'时放入1号队列中,…              k=0;          else              k=R[i][j]-'a'+1;          p=(LinkNode *)malloc(sizeof(LinkNode)); //创建新结点          strcpy(p->word,R[i]);          p->next=NULL;          if (head[k]==NULL)          {              head[k]=p;              tail[k]=p;          }          else          {              tail[k]->next=p;              tail[k]=p;          }      }  }  void Collect(String R[],LinkNode *head[])  //依次将各非空队列中的记录收集起来  {      int k=0,i;      LinkNode *p;      for (i=0; i<Radix; i++)          for (p=head[i]; p!=NULL; p=p->next)              strcpy(R[k++],p->word);  }  void RadixSort(String R[],int n)    //对R[0..n-1]进行基数排序  {      LinkNode *head[Radix],*tail[Radix]; //定义Radix个队列      int i,j;      for (i=MaxLen-1; i>=0; i--)             //从低位到高位做d趟箱排序      {          for (j=0; j<Radix; j++)              head[j]=tail[j]=NULL;           //队列置空          Distribute(R,head,tail,i,n);        //第i趟分配          Collect(R,head);                    //第i趟收集      }  }  int main()  {      int n=6;      String R[]= {"while","if","if else","do while","for","case"};      printf("排序前:\n");      DispWord(R,n);      PreProcess(R,n);      printf("预处理后:\n");      DispWord(R,n);      RadixSort(R,n);      printf("排序结果:\n");      DispWord(R,n);      EndProcess(R,n);      printf("最终结果:\n");      DispWord(R,n);      printf("\n");      return 0;  }  运行结果:



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果手机玩王者荣耀卡怎么办 玩王者荣耀闪屏怎么办 王者荣耀太卡了怎么办 想卖王者号qq怎么办 小米4电视发热严重怎么办 三星玩王者荣耀卡怎么办 华为麦芒5网络差怎么办 华为麦芒无线信号不好怎么办 华为麦芒6网络不好怎么办 华为麦芒6信号差怎么办 华为手机无线网信号差怎么办 华为麦芒6数据信号差怎么办 华为麦芒54g信号差怎么办 华为手机wifi信号差怎么办 华为手机导航信号弱怎么办 华为手机gps信号弱怎么办 麦芒5指纹消失了怎么办 华为应用锁密码忘了怎么办 华为麦芒5密码忘了怎么办 华为卡1无服务怎么办 经常卡1无服务怎么办 华为手机进水无服务怎么办 苹果手机进水后无服务怎么办 苹果6进水无服务怎么办 华为手机突然无服务怎么办 sim卡显示无服务怎么办 华为麦芒进水无限开关机怎么办 华为麦芒5进水黑屏怎么办 华为麦芒6进水了怎么办 4g手机开不开机怎么办 全屏钢化膜总是翘边怎么办 华为麦芒屏幕触屏失灵怎么办 华为麦芒5运行慢怎么办 手机屏保密码忘记了怎么办 麦芒5密码锁忘了怎么办 超薄手机壳松了怎么办 华为麦芒5声音小怎么办 笔记本外壳a面裂了怎么办 苹果手机外壳摔坏了怎么办 挂衣服肩膀出包怎么办 摩拜单车手机号注销了怎么办