[ create a new paste ] login | about

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

C, pasted on Jan 1:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 26

typedef struct DocNode{
	char ch;
	int times[3001];
	struct DocNode *next[300];
	struct DocNode *nextword[3001];
}DocNode, *DNode;

int DocInit (DNode DRoot, FILE *fp) {
	char a[100], b;
	int i, j, k, t, nu=0;
	DNode p, q;
	while (1) {
		if (fgetc(fp) == EOF) break;
		else nu++;
		while (fgetc(fp)!=10) continue;
		while (1) {
			for (t=0;t<100;t++) a[t]='\0';
			for (i=0,b = fgetc(fp);b!=32&&b!=10&&b!=EOF;b=fgetc(fp))	a[i++]=b;
			q=p=DRoot;j=0;
			while (j<i) {
				for (k=0;k<300;k++) {
					if (p->next[k]==NULL) {
						p->next[k] = (DNode)malloc(sizeof(DocNode));
						p->next[k]->ch = a[j];
						for (t=0;t<3001;t++) {
							p->next[k]->times[t]=0;
							p->next[k]->nextword[t]=NULL;
						}
						for (t=0;t<3001;t++) p->next[k]->next[t]=NULL;
						if (j==i-1) {
							p->next[k]->times[nu]=1;
							q->nextword[nu]=p->next[k];
							q=p->next[k];
						}
						p=p->next[k];break;
					}
					else if (p->next[k]->ch==a[j] && j!=i-1) {p=p->next[k];break;}
					else if (p->next[k]->ch==a[j] && j==i-1 && p->next[k]->times[nu]==0) {
						p->next[k]->times[nu]++;
						q->nextword[nu]=p->next[k];
						q=p->next[k];
						q->nextword[nu]=NULL;
						break;
					}
					else continue;
				}
				j++;
			}
			if (b==10||b==EOF) break;
		}
	}
	return nu;
}

int Sin_Traverse(DNode p, char *a, int t, int i, int nu, int tag) {
	int k;
	if (tag==1) return tag;
	if (t==i) return tag;
	for (k=0;p->next[k]!=NULL;k++) {
		if (p->next[k]->ch==a[t]) {
			if (t==i-1 && p->next[k]->times[nu]==1) return tag=1;
			else if (t==i-1 && p->next[k]->times[nu]==0) continue;
			else tag=Sin_Traverse(p->next[k],a,t+1,i,nu,tag);
		}
	}
	return tag;
}

void WordInDocument (DNode DRoot,FILE *fp, FILE *fq,int nu) {
	int k, ca=1, tag, i;
	char a[100], b;
	while (1) {
		for(k=0;k<100;k++) a[k]='\0';
		i=0;
		b=fgetc(fp);
		if (b==EOF) break;
		while (b!=10 && b!=EOF) {a[i++]=b;b=fgetc(fp);}
		fprintf(fq,"CASE %d:\n",ca++);
		for (k=1;k<nu+1;k++) {
			tag=0;
			tag=Sin_Traverse(DRoot,a,0,i,k,0);
			if (tag==1) fprintf(fq,"%d ",k);
		}
		fprintf(fq,"\n");
	}
}

int MultiTraverse (DNode root, DNode p, char **a, int w, int t, int tag, DNode q, int nu) {
	int i =0,k;
	if (tag==1) return tag;
	while (a[w][i]!='\0') i++;
	for (k=0;p->next[k]!='\0';k++) {
		if (p->next[k]->ch==a[w][t]) {
			if (t==i-1) {
				if(p->next[k]->times[nu]==0) continue;
				else if (w==0) tag=MultiTraverse(root,root,a,w+1,0,tag,p->next[k],nu);
				else if (q->nextword[nu]!=p->next[k]) continue;
				else if (a[w+1][0]!='\0') tag=MultiTraverse(root,root,a,w+1,0,tag,p->next[k],nu);
				else if (a[w+1][0]=='\0') return tag=1;
				else continue;
			}
			else tag=MultiTraverse(root,p->next[k],a,w,t+1,tag,q,nu);
		}
	}
	return tag;
}

void TwoWordInDocument (DNode DRoot, FILE *fp, FILE *fq, int nu) {
	int w, i, k, j, ca=1, tag;
	char a[2][20], b;
	while (1) {
		for (k=0;k<2;k++)
			for (j=0;j<20;j++)
				a[k][j]='\0';
		w=0;
		b=fgetc(fp);
		if (b==EOF) break;
		while (1) {
			for (i=0;b!=32 && b!= 10 && b!=EOF;b=fgetc(fp)) a[w][i++]=b;
			if (b==32) w++;
			if (b==10 || b==EOF) break;
		}
		fprintf(fq,"CASE %d:\n",ca++);
		for (k=1;k<nu+1;k++) {
			tag=0;
			tag=MultiTraverse(DRoot,DRoot,a,0,0,0,NULL,k);
			if (tag==1) fprintf(fq,"%d ",k);
		}
		if (b==EOF) break;
	}
}

void MultiWordInDocument (DNode DRoot, FILE *fp, FILE *fq, int nu) {
	int w, i, k, j, ca=1, tag;
	char a[6][20], b;
	while (1) {
		for (k=0;k<6;k++)
			for (j=0;j<20;j++)
				a[k][j]='\0';
		w=0;
		b=fgetc(fp);
		while(b!=10) {b=fgetc(fp);continue;}
		if (b==EOF) break;
		while (1) {
			for (i=0;b!=32 && b!= 10 && b!=EOF;b=fgetc(fp)) a[w][i++]=b;
			if (b==32) w++;
			if (b==10 || b==EOF) break;
		}
		fprintf(fq,"CASE %d:\n",ca++);
		for (k=1;k<nu+1;k++) {
			tag=0;
			tag=MultiTraverse(DRoot,DRoot,a,0,0,0,NULL,k);
			if (tag==1) fprintf(fq,"%d ",k);
		}
		if (b==EOF) break;
	}
}

int main(void) {
	int DocNum, i;
	FILE *fp, *fq;
	DNode DRoot;
	DRoot=(DNode)malloc(sizeof(DocNode));
	DRoot->ch='\0';
	for (i=0;i<3001;i++) {
		DRoot->times[i]=0;
		DRoot->nextword[i]=NULL;
	}
	for (i=0;i<300;i++) DRoot->next[i]=NULL;
	fp = fopen("./Document/Document.txt","r");
	printf("根据Documnet目录下的document.txt文件建立字典序...\n");
	DocNum=DocInit(DRoot, fp);
	fclose(fp);
	fp = fopen("./WordInDocument/WordInDocument.txt","r");
	fq = fopen("./WordInDocument/WordInDocument_Result.txt","a+");
	printf("根据WordInDocument目录下WordInDocument.txt找出单词所在的Document(结果参见同目录下的WordInDocument_Result.txt文件)...\n");
	WordInDocument(DRoot,fp,fq,DocNum);
	fclose(fp);fclose(fq);
	fp = fopen("./WordInDocument/SmallWordInDocument.txt","r");
	fq = fopen("./WordInDocument/SmallWordInDocument_Result.txt","a+");
	printf("根据WordInDocument目录下SmallWordInDocument.txt找出单词所在的Document(结果参见同目录下的SmallWordInDocument_Result.txt文件)...\n");
	WordInDocument(DRoot,fp,fq,DocNum);
	fclose(fp);fclose(fq);
	fp = fopen("./TwoWordInDocument/TwoWordInDocument.txt","r");
	fq = fopen("./TwoWordInDocument/TwoWordInDocument_Result.txt","a+");
	printf("根据TwoWordInDocument目录下TwoWordInDocument.txt找出单词所在的Document(结果参见同目录下的TwoWordInDocument_Result.txt文件)...\n");
	TwoWordInDocument (DRoot, fp, fq, DocNum);
	fclose(fp);fclose(fq);
	fp = fopen("./TwoWordInDocument/SmallTwoWordInDocument.txt","r");
	fq = fopen("./TwoWordInDocument/SmallTwoWordInDocument_Result.txt","a+");
	printf("根据TwoWordInDocument目录下SmallTwoWordInDocument.txt找出单词所在的Document(结果参见同目录下的SmallTwoWordInDocument_Result.txt文件)...\n");
	TwoWordInDocument (DRoot, fp, fq, DocNum);
	fclose(fp);fclose(fq);
	fp = fopen("./MultiWordInDocument/MultiWordInDocument.txt","r");
	fq = fopen("./MultiWordInDocument/MultiWordInDocument_Result.txt","a+");
	printf("根据MultiWordInDocument目录下MultiWordInDocument.txt找出单词所在的Document(结果参见同目录下的MultiWordInDocument_Result.txt文件)...\n");
	MultiWordInDocument (DRoot, fp, fq, DocNum);
	fclose(fp);fclose(fq);
	fp = fopen("./MultiWordInDocument/SmallMultiWordInDocument.txt","r");
	fq = fopen("./vWordInDocument/SmallMultiWordInDocument_Result.txt","a+");
	printf("根据MultiWordInDocument目录下SmallMultiWordInDocument.txt找出单词所在的Document(结果参见同目录下的SmallMultiWordInDocument_Result.txt文件)...\n");
	MultiWordInDocument (DRoot, fp, fq, DocNum);
	fclose(fp);fclose(fq);
	free(DRoot);
	return 0;
}


Create a new paste based on this one


Comments: