编程珠玑--第二章变位词程序的实现

题目描述:给定一个英语字典,找出其中的所有变位词集合。例如,“pots”、“stop”、“tops”互为变位词,因为每一个单词都可以通过改变其他单词中的字母的顺序来得到。

程序主要有三部分组成,sign、sort和squash。我们用下图来说明(假设要处理的单词有六个pans pots opt snap stop tops),处理结果如下:

编程珠玑--第二章变位词程序的实现_第1张图片

可见sign是将单词进行排序(将pans排成anps,按照字母序),sort是对排好序的所有单词再进行一次排序,程序代码如下: 

#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define MAXWORDNUM 100000
#define MAXWORDLEN 100
using namespace std;

struct word_all{
	char word[MAXWORDLEN];
	char sig[MAXWORDLEN];
};

word_all all[100000];

bool cmp(word_all a,word_all b){
	if(strcmp(a.sig,b.sig)<0)
		return 1;
	return 0;
}
int main(){
	int num=0;
	while(scanf("%s",all[num].word)!=EOF){
		strcpy(all[num].sig,all[num].word);
		sort(all[num].sig,all[num].sig+strlen(all[num].sig));
		num++;
	}
	sort(all,all+num,cmp);
	//打印经过处理过的数据
	//for(int i=0;i<num;i++){
	//	printf("%s %s\n",all[i].sig,all[i].word);
	//}
	//输出
	int linenum=0;
	char oldsig[MAXWORDLEN];
	strcpy(oldsig,"");
	for(int j=0;j<num;j++){
		if(strcmp(oldsig,all[j].sig)!=0&&linenum>0)
			printf("\n");
		strcpy(oldsig,all[j].sig);
		linenum++;
		printf("%s ",all[j].word);
	}
	return 0;
}
输出结果为:


一个小插曲:编程珠玑上写的比较单词大小的函数int charcomp(char *x,char *y){return *x - *y};

这种函数应用到sort最后一个参数中是不行的,第一点:首先因为数组是char类型的,应该使用char x,char y;

第二点:由于最后一个比较函数是bool类型的,x-y比如说x=3,y=4,不管x-y还是y-x返回都不等于零,返回的为true,所以是不能作为比较条件的。应该改为 return x<y。

你可能感兴趣的:(编程)