YTU OJ 2301: 串的基本操作二(串)

题目描述

输入一定量的单词(#结束),按字母顺序排序后输出,若有重复则只保留一个。

样例输入

hello
I
how
fine
free
if
free
final
full
all
aware
#

样例输出

all
aware
final
fine
free
full
hello
how
I
if

分析

从样例输出可以看出,并不是简单的根据单词首字母排序,排序规则如下:

  1. 首字母ASCII小的在前,并且此处不区分大小写,即‘A’和‘a’均排在‘B’或‘b’的前面
  2. 若首字母相同,则继续比较下一个字母,直至对应位置的字母不相同或一个单词已结束,另一个单词未结束

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 1000
typedef struct
{
    
    
    char data[MaxSize];
    int length;
}SqString;
int judge(char s1[],char s2[]) //返回1说明s1大,返回2说明s2大
{
    
    
    int i,j,l1,l2,n,flag=0;
    l1=strlen(s1);
    l2=strlen(s2);
    if(l1>=l2)
        n=l2;
    else
        n=l1;
	//
	//若单词首字母为大写,统一变成小写,方便比较
    if(s1[0]>='A' && s1[0]<='Z') 
    {
    
    
        flag=1;
        s1[0] += 32;
    }
    if(s2[0]>='A' && s2[0]<='Z')
    {
    
    
        flag=2;
        s2[0] += 32;
    }
    //
    for(i=0;i<n;i++)
    {
    
    
        if(s1[i]>s2[i])
        {
    
    
            if(flag==1)
                s1[0] =s1[0]-32; //返回结果之前要将变化的首字母复原,以下同理
            else if(flag==2)
                s2[0] =s2[0]-32;
            return 1;
        }
        else if(s1[i]<s2[i])
        {
    
    
            if(flag==1)
                s1[0] =s1[0]-32;
            else if(flag==2)
                s2[0] =s2[0]-32;
            return 2;
        }
    }
    if(l1==i) //若一个单词比较完,此时的结果为较长的单词大
    {
    
    
        if(flag==1)
            s1[0] =s1[0]-32;
        else if(flag==2)
            s2[0] =s2[0]-32;
        return 2;
    }
    else
    {
    
    
        if(flag==1)
            s1[0] =s1[0]-32;
         else if(flag==2)
            s2[0] =s2[0]-32;
        return 1;
    }
}
void sort(SqString s[],int n)//排序
{
    
     
    SqString p;
    int i,j;
    for(i=0;i<n;i++)
    {
    
    
        for(j=0;j<n-i-1;j++)
        {
    
    
            if(judge(s[j].data,s[j+1].data) == 1)
            {
    
    
                p = s[j];
                s[j] = s[j+1];
                s[j+1] = p;
            }
        }
    }
}
int main()
{
    
    
    SqString s[1000];
    int i=0,j,t;
    while(gets(s[i].data)) //循环输入单词
    {
    
    
        if(strcmp(s[i].data,"#")==0) //若输入“#”,输入结束,退出循环
            break;
        s[i].length=strlen(s[i].data);
        //puts(s[i].data);
        //printf("--%d--\n",s[i].length);
        i++;
    }
    sort(s,i); //排序
    for(j=0;j<i;j++)//输出,注意题目要求相同单词只保留一个
    {
    
    
        puts(s[j].data);
        for(t=j;t<i;t++)//判断是否存在与当前单词相同的单词
        {
    
    
            if(strcmp(s[j].data,s[t].data) != 0)//一直循环直到不相同
            {
    
    
                break;
            }
        }
        j=t-1;//跳过了相同的单词
    }
//  system("pause");
}

猜你喜欢

转载自blog.csdn.net/u014295602/article/details/103291818
今日推荐