题目要求:
(华为OJ)C 语言—查找兄弟单词(华为OJ)C 语言—查找兄弟单词(华为OJ)C 语言—查找兄弟单词
(华为OJ)C 语言—查找兄弟单词
解题思路:
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;
}

相关文章:

  • 2022-12-23
  • 2021-08-29
  • 2022-12-23
  • 2021-09-04
  • 2022-12-23
  • 2022-01-03
  • 2021-12-27
猜你喜欢
  • 2021-09-11
  • 2022-12-23
  • 2021-09-08
  • 2021-07-15
  • 2021-10-17
相关资源
相似解决方案