(HW OJ)字符统计,统计一个字符串中的每种字符的个数,并将字符按数目大小进行输出;若字符的数目相等,则比较二者ASCII码,较大者优先输出

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include "OJ.h"

typedef struct char_Node
{
    char letter;
    int count;

}charNode;

void Init_AllcharNodes(void); //内部函数用来初始化存储内存

charNode g_cNode[100];

// 功能:输入待统计字符串供用户统计
// 输入:char* pInput  待统计的字符串
// 输出:无
// 返回:无
void InputString(char* pInput)
{
   int i = 0;
   int flag = 0;

   if(NULL == pInput)
       return;
   
   Init_AllcharNodes();

   while( *pInput != '\0')
   {
       
       if( (*pInput >= '0' && *pInput<= '9') || (*pInput >= 'a' && *pInput<= 'z') || (*pInput >= 'A' && *pInput<= 'Z')\
         || (*pInput == ' '))
       {
          
           for(i = 0;i<100 ;i++) //有该字符
           { 
               if(g_cNode[i].letter == *pInput)
              {
                  g_cNode[i].count = g_cNode[i].count+1;
                  flag  = 1;
                  break;
              }
           }    

          if(0 == flag)
          {
              for(i = 0;i<100;i++) //没有该字符,进行分配
              { 
                 if((g_cNode[i].letter == '\0') && (g_cNode[i].count == 0) )
                 {
                    g_cNode[i].letter = *pInput;
                    g_cNode[i].count = 1;
                    break;    
                 }
              }

          }
     
       }
       else
           ;

     flag  = 0;
     pInput++;

   }//end while()
   

}
// 功能:获取前面输入的字符串的统计信息
// 输入:无
// 输出:char* *pInput 获取统计结果,内存由函数自己申请,在函数外部释放,如果没有统计信息,返回NULL
// 返回:int  如果成功返回1,失败返回0
int GetStaticString(char* *pInput)
{
    int i = 0,j = 0;
    int  count_temp = 0;
    char letter_temp = '\0';

    *pInput = (char*)malloc(sizeof(char)*100);
    if(NULL == *pInput)
        return 0;

    for(i = 0;i< 100;i++)
    {
      (*pInput)[i] = '\0';
    }

    for(i = 0;i< 100-1 ;i++) //使用选择排序法,将要进行输出的字母进行从大到小排序
    {
        for(j = i+1 ;j < 100 ;j++)
        {
            if( g_cNode[i].count < g_cNode[j].count )
            {
                letter_temp       = g_cNode[i].letter;
                g_cNode[i].letter = g_cNode[j].letter;
                g_cNode[j].letter = letter_temp;

                count_temp        = g_cNode[i].count;
                g_cNode[i].count  =  g_cNode[j].count;
                g_cNode[j].count  = count_temp;
             
            }
            else if(g_cNode[i].count == g_cNode[j].count)
            {
                if(g_cNode[i].letter >  g_cNode[j].letter)
                {
                    letter_temp       = g_cNode[i].letter;
                    g_cNode[i].letter = g_cNode[j].letter;
                    g_cNode[j].letter = letter_temp;

                    count_temp        = g_cNode[i].count;
                    g_cNode[i].count  =  g_cNode[j].count;
                    g_cNode[j].count  = count_temp;
                }
            }
        }
    
    }
    
    
    for(i = 0;i< 100;i++)
    {
       if( ( g_cNode[i].letter != '\0') && (g_cNode[i].count != 0) )
       {
            (*pInput)[i] = g_cNode[i].letter;
       }
        
    }

    if(g_cNode[0].letter == '\0')
        return 0;
    
    return 1;
}

//功能:清空前面输入的字符串的统计信息
//输入:无
//输出:无
//返回:无

void Clear()
{
   int i = 0;

   for(i = 0;i<100;i++)
   {
     g_cNode[i].letter = '\0';
     g_cNode[i].count = 0;  

   }
    //memset(g_cNode, 0 ,sizeof(charNode)*100);
}

void Init_AllcharNodes(void)
{
   int i = 0;

   for(i = 0;i<100;i++)
   {
     g_cNode[i].letter = '\0';
     g_cNode[i].count = 0;  

   }
}

猜你喜欢

转载自blog.csdn.net/yuhoujiangnan2011/article/details/82558154