由字母a~z所組成的字串的一個集合中,各個字元的長度之和為n。設計一個O(n)時間的演算法,將這個集合中所有字串依字典進行排序。注意,這裡可能存在非常長的字串。
#include <stdio.h>
#include <malloc.h>
typedef struct tire
{
struct tire *next[26];
char date;
int cnt;
}*_tire;
void init_tire(_tire root, char *string)
{
_tire s;
s=root;
while(*string!='/0')
{
if(s->next[*string - 'a']==NULL)
{
s->next[*string - 'a'] = (_tire)malloc(sizeof(struct tire));
(s->next[*string - 'a'])->date = *string;
s = s->next[*string - 'a'];
for(int i=0;i<26;i++)
{
s->next[i] = NULL;
}
}
else
{
s = s->next[*string - 'a'];
}
string++;
}
s->cnt=1;
}
void print(_tire root, char *s, int i)
{
int j;
s[i] = root->date;
if(root->cnt==1)
{
s[i+1] = 0;
puts(s);
}
for(j=0;j<26;j++)
{
if(root->next[j]!=NULL)
{
print(root->next[j],s,i+1);
}
}
}
int main()
{
_tire root;
int m,i;
char s[265];
root = (_tire)malloc(sizeof(struct tire));
puts("輸入字串個數:");
for(i=0;i<26;i++)
{
root->next[i]=NULL;
}
scanf("%d",&m);
getchar();
while(m--)
{
gets(s);
init_tire(root,s);
}
puts("/n依字典排序後:");
for(i=0;i<26;i++)
{
if(root->next[i] != NULL)
{
print(root->next[i],s,0);
}
}
return 0;
}