[ create a new paste ] login | about

Link: http://codepad.org/zPtsX6QA    [ raw code | fork ]

link307 - C, pasted on Dec 22:
typedef struct Topt {

	int times;

	char c[MAX];

}Topt, *Topten;

int Traverse_Topten (Node p, char *a, int i, struct  Topt * top) {

	int k, t;

	Node q=p;

	if (p->times!=0) {					//所在单词出现频率不为零则输出该单词

		if (p->times<top[8]->times && p->times>=top[9]->times) {

			top[9]->times=p->times;

			top[9]->c[]={"\0"};

			strncpy(top[9]->c,a,i-1);

		}

		else

			for (k=0;k<9;k++)

				if (p->times>=top[k].times) {

					for (t=8;t>=k;t--) {

						top[t+1]->times=top[t]->times;

						top[t+1]->c[]={"\0"};

						strcpy(top[t+1]->c,top[t]->c);

					}

					top[k]->times=p->times;

					top[k]->c[]={"\0"};

					strncpy(top[k]->c,a,i-1);

				}

		//for (k=0;k<i;k++) fprintf(fq,"%c",a[k]);

		//fprintf(fq,"\n");

	}

	if (p->next[0]=='\0') return 0;		//已到达字典序叶子节点,返回

	else							//未到达字典序叶子节点,继续向下检索

		for (k=0;p->next[k]!='\0';k++) {

				q=p;

				a[i++]=p->next[k]->ch;

				p=p->next[k];

				Traverse_Topten (p,a,i,top);		//递归

				p=q;

		}

	return 0;

}



void PrefixFrequence (Node Root, FILE *fp, FILE *fq) {

	int id=1, i, j, k, t, tag;

	Node p, q;

	char a[MAX] = {'\0'}, b;

	struct Topt * top[10];

	for (k=0;k<10;k++) {			//初始化数组

		top[k]=(Topten)malloc(sizeof(Topt));

		top[k]->times=0;

		top[k]->char[]={"\0"};

	}

	while (1) {

		for (i=0;i<MAX;i++) {		//一次读入文件中给定的前缀

			b = fgetc(fp);

			if (b==10 || b==EOF) break;

			else a[i] = b;

		}

		if (i!=0) fprintf(fq, "CASE %d:\n",id++);	//输出单词的ID号

		j=0; p=Root; tag=1;

		while(j<i) {

			for (k=0;k<MAX;k++) {

				if(p->next[k]=='\0') {tag=0;break;}

				else if (p->next[k]->ch==a[j]) {q=p;p=p->next[k];break;}

				else continue;

			}

			if (tag==0) break;			//没有该前缀的单词

			j++;

		}

		if (tag!=0 && i!=0) {		//在字典中找出优先级最高的十个符合前缀的单词

			Traverse_Topten(p,a,i,top);

			k=0;

			while(top[k]->times!=0) {

				for (t=0;top[k]->c[t]!='\0';t++)	fprintf(fq,"%c",top[k]->c[t]);

				fprintf(fq,"\n");

				k++;

				if (k>9) break;

			}

		}

		if (b == EOF) break;

	}

}


Create a new paste based on this one


Comments: