(华为OJ)C 语言—查找兄弟单词
2019-01-31 10:56
155 查看
题目要求:
解题思路:
1、首先定义一个结构体,用来存放单词
2、这个题主要要解决的就是整理出兄弟单词和兄弟单词的排序
3、可以用链表、哈希表、数据库来存储单词,这里我用的结构体数组(指针数组)方便操作一些
4、排序用的是C语言库自带的qsort()快速排序很方便,处理函数是利用strcmp(),strcmp是根据ascll值的大小排序的,刚刚好可以实现按字典顺序排序
详细见代码:
/************************************************************************ * 文件名:brotherword * 文件功能描述:查找兄弟单词 * 文件作者名:Mr_han QQ:785937095 * 说明: * 1、在字典中加入单词 * 2、查找指定单词在字典中的兄弟单词个数 * 3、查找指定单词的指定序号的兄弟单词,指定序号指字典中兄弟单词按字典顺序排序后的序号 * 4、清空字典中所有的单词 **************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define LONG long #define CHAR char #define N 1000 #define M 50 typedef struct{ CHAR word[M]; /*存放单词*/ }Dict; /*筛选兄弟单词处理函数*/ LONG Judge ( CHAR goal[], CHAR word[] ) /*( 筛选目标, 核心单词 )*/ { LONG sum[26] = {0}; /*用来存储每个字母的个数*/ LONG count[26] = {0}; LONG i, n; if ( ( strlen(goal) != strlen(word) ) || ( strcmp(goal, word) == 0 ) ) /*首先判断长度是否一致,其次不能与核心单词相同*/ { return 0; }else { n = strlen ( word ); for ( i = 0; i < n; i++ ) /*记录核心单词中每个字母的个数*/ { sum[word[i]-'a']++; } for ( i = 0; i < n; i++ ) /*记录筛选单词中每个字母的个数*/ { count[goal[i]-'a']++; } for ( i = 0; i < 26 && count[i] == sum[i]; i++ ); /*对比是否完全相同*/ if (i == 26) /*如果i为26说明for循环运行到了最后,则该单词是兄弟单词*/ { return 1; }else { return 0; } } } /*快速排序处理函数*/ LONG Wordcmp ( CHAR goal[], CHAR word[] ) { return strcmp ( goal, word ); /*运用strcmp()将两单词按ASCII值比较*/ } /*查找兄弟单词处理函数*/ void Brotherword ( Dict Input[] , CHAR word[], LONG n, LONG m ) /*( 所有单词存放的数组, 主要单词, 单词总共个数, 输出第几个单词 )*/ { LONG i, j; j = 0; Dict Output ; /*用来存放筛选后的兄弟单词*/ for ( i = 0; i < n; i++ ) /*将所有单词逐个筛选*/ { if ( Judge ( Input[i].word, word ) == 1 ) { strcpy ( Output[j].word, Input[i].word); j++; } } qsort ( Output, j, sizeof(Dict), Wordcmp ); /*快速排序函数 ( 数组,需要排序的元素个数,单个元素所占内存大小,比较函数 )*/ printf ( "共有 %d 个兄弟单词, 第 %d 个是%s .\n", j, m, Output[m - 1].word ); return; } void main() { Dict Input ; /*创建一个结构体数组*/ CHAR temp[M]; LONG n, i, order; printf ( "单词个数n、依次输入单词、输入要查找的单词、输出第几个单词(回车间隔):\n" ); scanf ( "%d", &n ); getchar ( ); /*回收垃圾字符*/ for ( i = 0; i < n; i++ ) { gets ( temp ); strcpy ( Input[i].word, temp ); /*将录入的单词放入数组*/ } gets (temp); /*获取主要单词*/ scanf ( "%d", &order ); /*获取输出第几个兄弟单词*/ Brotherword ( Input, temp, n, order); return; }