题目要求:
解题思路:
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[N]; /*用来存放筛选后的兄弟单词*/
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[N]; /*创建一个结构体数组*/
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;
}