您的位置:首页 > 其它

(华为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: