試題描述:給定n個(gè)字符串滑肉,請(qǐng)對(duì)n個(gè)字符串按照字典序排列
輸入描述:
輸入第一行為一個(gè)正整數(shù)n(1≤n≤1000),下面n行為n個(gè)字符串(字符串長(zhǎng)度≤100),字符串中只含有大小寫字母
輸出描述:
數(shù)據(jù)輸出n行游盲,輸出結(jié)果為按照字典序排列的字符串
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define StringSize 100
int main()
{
int N;
scanf("%d", &N);
getchar();
int i = 0, j = 0;
char* str[N];
//int num[N];
for(i = 0; i < N; i++)
{
str[i] = (char*)malloc(sizeof(char) * StringSize);
gets(str[i]);
}
for(i = 0; i < N - 1; i++)
{
for(j = 0; j < N-i-1; j++)
{
if(strcmp(str[j], str[j+1]) > 0)
{
char tmp[100];
strcpy(tmp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], tmp);
}
}
}
for(i = 0; i < N; i++)
{
printf("%s\n", str[i]);
}
}
此題默認(rèn)區(qū)分大小寫,即大寫字母永遠(yuǎn)小于小寫字母峰鄙,例如Z<a;如果不區(qū)分栖袋,則應(yīng)該如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define StringSize 100
int compare(char* p1, char* p2, int n1, int n2)
{
//int flag;
int n;
if(n1 < n2)
n = n1;
else
n = n2;
int i = 0;
for(i = 0; i < n; i++)
{
char tmp1 = p1[i];
char tmp2 = p2[i];
if((int)tmp1 < 97)
{
tmp1 = tmp1 + 32;
}
if((int)tmp2 < 97)
{
tmp2 = p2[i] + 32;
}
if((int)tmp1 < (int)tmp2)
return 0;
else if((int)tmp1 == (int)tmp2)
{
if(n1 < n2)
return 0;
else
return 1;
}
else
return 1;
}
}
int main()
{
int N;
scanf("%d", &N);
getchar();
int i = 0, j = 0;
char* str[N];
//int num[N];
for(i = 0; i < N; i++)
{
str[i] = (char*)malloc(sizeof(char) * StringSize);
gets(str[i]);
}
for(i = 0; i < N - 1; i++)
{
for(j = 0; j < N-i-1; j++)
{
if(compare(str[j], str[j+1], strlen(str[j]), strlen(str[j+1])))
{
char tmp[100];
strcpy(tmp, str[j]);
strcpy(str[j], str[j+1]);
strcpy(str[j+1], tmp);
}
}
}
for(i = 0; i < N; i++)
{
printf("%s\n", str[i]);
}
}