Mr.Death

小白自学笔记

字母重排

/*  输入一个字典,用*****结尾,输入若干单词,每个单词w,都需要在字典中找出所有可以用w的字母重排后得到的单词,
并按照字典序从小到大的顺序在一行中输出(如果不存在,输出:( ,输入单词之间用空格或空行隔开,且所有输入单词都由不超过6个小
写字母组成,注意,字典中的单词不一定按字典排列)。
输入: tarp given score refund only trap work earn course pepper part 
*****
resco nfudre aptr sett oresuc 
输出:
score
refund 
part tarp trap
:(
course */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int n;
char word[2000][10],sorted[2000][10];
//字符比较函数
int cmp_char(const void* _a,const void* _b)
/*const void* _a,这是定义了一个指针_a,_a可以指向任意类型的值,但它指向的值必须是常量。
在这种情况下,我们不能修改被指向的对象,但可以使指针指向其他对象。*/
{
	char* a=(char*)_a;
	char* b=(char*)_b;
	return *a-*b;
} 
//字符串比较函数
int cmp_string(const void* _a,const void* _b)
{
	char* a=(char*)_a;
	char* b=(char*)_b;
	return strcmp(a,b);
} 
int main(int argc, char *argv[]) {
	n=0;
	for(;;)
	{
		scanf("%s",word[n]);
		if(word[n][0]=='*')
			break;
		n++;
	}
	qsort(word,n,sizeof(word[0]),cmp_string);   //给所有单词排序 
	/*void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
      各参数:
    base -- 指向要排序的数组的第一个元素的指针。
    nitems -- 由 base 指向的数组中元素的个数。
    size -- 数组中每个元素的大小,以字节为单位。
    compar -- 用来比较两个元素的函数。
	*/
	for(int i=0;i<n;i++)
	{
		strcpy(sorted[i],word[i]);
		qsort(sorted[i],strlen(sorted[i]),sizeof(char),cmp_char); //给每个单词排序 
	}
	char s[10];
	while(scanf("%s",s)==1)
	{
		qsort(s,strlen(s),sizeof(char),cmp_char);   //给输入单词排序 
		int found=0;
		for(int i=0;i<n;i++)
		{
			if(strcmp(sorted[i],s)==0)
			{
				found=1;
				printf("%s\n",word[i]);    //输出原始单词,而不是排序后的 
			}
		}
		if(!found)
			printf(":(\n");
	}
	return 0;
}
编译环境:VC++6.0
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w819893168/article/details/79952831
个人分类: Algorithm
上一篇6174问题
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭