题目描述
输入一定量的单词(#结束),按字母顺序排序后输出,若有重复则只保留一个。
样例输入
hello
I
how
fine
free
if
free
final
full
all
aware
#
样例输出
all
aware
final
fine
free
full
hello
how
I
if
分析
从样例输出可以看出,并不是简单的根据单词首字母排序,排序规则如下:
- 首字母ASCII小的在前,并且此处不区分大小写,即‘A’和‘a’均排在‘B’或‘b’的前面
- 若首字母相同,则继续比较下一个字母,直至对应位置的字母不相同或一个单词已结束,另一个单词未结束
代码:
#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");
}