/*
字典搜索
问题描述:
给定一个字典,有若干个单词,每个单词不超过6个字母,以****作为输入结束
要求:输入一堆乱序字母作为输入单词,比较字典中的字母,如果输入的单词经过排列组合
可以与字典中的单词匹配,则输出(如果和多个单词匹配,从小到大输出)
如果字典单词无匹配,输出:(
样例输入:
trap given score refund only tarp work earn course pepper part ******
resco nfudre aptr seet oresuc
样例输出:
score
refund
part tarp trap
:(
course
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
#define N 7
int char_cmp(const void *,const void *);
int charpoin_cmp(const void *,const void *);
void SortDir(void *,int num,int size,int (*)(const void *,const void *));
void Prin(char **,int);
void SortDir2(char *mid,int);
int main(void)
{
char **mid=(char **)malloc(MAX*sizeof(char *));
char **sorted=(char **)malloc(MAX*sizeof(char *));
char* stop="****";
char *str;
int flag=0;
int i=0;
int cnt=0;
do{
str=(char *)malloc(N*sizeof(char));//数组储存的是指针
scanf("%s",str);
mid[i]=str;
fflush(stdin);
i++;
}while((strcmp(stop,mid[i-1])));
//字典排序
cnt=i;
SortDir(mid,cnt-1,sizeof(char *),charpoin_cmp);
for(i=0;i<cnt-1;i++){
str=(char *)malloc(N*sizeof(char));
strcpy(str,mid[i]);
sorted[i]=str;
SortDir(sorted[i],strlen(sorted[i]),sizeof(char),char_cmp);
}
//储存单词
while(1){
str=(char *)malloc(N*sizeof(char));
if(scanf("%s",str)==EOF) break;
SortDir(str,strlen(str),sizeof(char),char_cmp);
for(i=0;i<cnt-1;i++){
if(!strcmp(sorted[i],str)){
printf("%s",mid[i]);
flag=1;
}
}//for i
if(flag == 0){
printf(":(");
}//if flag
flag=0;
putchar('\n');
}//while
return 0;
}
int char_cmp(const void *a,const void *b)
{
return *(char *)a-*(char *)b;
}
int charpoin_cmp(const void *a,const void *b)
{
return strcmp(*(char **)a,*(char **)b);
}
void SortDir(void *mid,int num,int size,int cmp(const void *a,const void *b))
{
int i,j;
int cnt;
int min=0;
void *temp=(void *)malloc(size);
for(i=0;i<num-1;i++){
for(min=i,j=i+1;j<num;j++){
if(cmp(mid+min*size,mid+j*size)>0)
min=j;
}
memcpy(temp,mid+i*size,size);
memcpy(mid+i*size,mid+min*size,size);
memcpy(mid+min*size,temp,size);
}
}
void Prin(char **mid,int n)
{
int i;
for(i=0;i<n;i++){
puts(mid[i]);
putchar('\n');
}
}