问题标签用户 求助!用二叉树构建倒排索引文件出现错误
目录text下共十个编号为P0到P9的txt文件,分别写有一个字母a,b,c...用二叉树的构建倒排索引输出在Index.txt里,
应该按字母顺序输出字母出现的频率和文档id,即
“a 1 0
b 1 1
c 1 2
...
j 1 9"
运行结果却是Index.txt里只有“c 1 0 ”一行。。。
各位大神帮忙查一下哪里出了问题。。。
代码如下:
程序代码:
#include #include #include #define txtNum 10 typedef struct IndexTree { char data[20]; //设单词长度最大为20 int length; //单词的实际长度 int docID[txtNum]; //假设文档集中有10篇文档 int docfrequency; //文档频率,即文档出现在几篇文档中 struct IndexTree *lchild; //左儿子存放所有比该单词小的节点 struct IndexTree *rchild; //右儿子存放所有比该单词大的节点 }IndexTree; struct IndexTree CreatIndextree(struct IndexTree *root,FILE *fp,int id) { int i=0,j; struct IndexTree *p,*q; char ch; p=(struct IndexTree)malloc(sizeof(IndexTree)); p->data[0]='\0'; p->docfrequency=0; if(fp==NULL) { printf("\nCannot open file strike any key exit!"); return NULL; } ch=fgetc(fp); while((ch!=EOF)&&(root==NULL)) //根结点不存在时,先建立根结点 { if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){ if(ch<='Z') ch=ch+32; p->data[i]=ch; i++; ch=fgetc(fp); } else{ if(p->data[0]=='\0'){ch=fgetc(fp);continue;} p->length=i; p->data[i]='\0'; p->docID[0]=0; //根节点的的第一次出现一定是在编号为0的文档中 p->docfrequency=1; //首次出现后文档频率变为1 i=0; p->lchild=NULL; p->rchild=NULL; root=p; ch=fgetc(fp); } } //根结点已存在 q=(struct IndexTree*)malloc(sizeof(IndexTree)); q->data[0]='\0' ; while(ch!=EOF){ if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){ if(ch<='Z') ch=ch+32; q->data[i]=ch; i++; ch=fgetc(fp); } else { if(q->data[0]=='\0'){ch=fgetc(fp);continue;} q->data[i]='\0'; q->length=i; i=0; q->lchild=NULL; q->rchild=NULL; if(p==NULL)p=root; ch=fgetc(fp); while(p!=NULL) //寻找待插入节点的位置 { if(strcmp(q->data,p->data) if(p->lchild==NULL) //且其左子树为空 { q->docID[0]=id; q->docfrequency=1; p->lchild=q; // 则插入 p=NULL; } //并置当前节点为空,退出当前的while循环 else p=p->lchild; } //否则继续访问其左子树 else if(strcmp(q->data,p->data)>0){ //如果待插入的节点的值大于当前节点的值 if(p->rchild==NULL) //且其右子树为空 { q->docID[0]=id; q->docfrequency=1; p->rchild=q; //则插入 p=NULL; } //并置当前节点为空,退出当前的while循环 else p=p->rchild; } //否则继续访问其右子树 else{ if((*p).docID[(*p).docfrequency-1]!=id){ j=(*p).docfrequency; (*p).docID[j]=id; p->docfrequency++; } p=NULL; } }//while q=(struct IndexTree*)malloc(sizeof(IndexTree)); q->data[0]='\0'; }//else }//while return root; } //将倒排列表写入txt文件 FILE fp2; void WriteInvertedFile(struct IndexTree root){ int i=0; if(root==NULL) return; WriteInvertedFile(root->lchild); //中序遍历二叉树左子树 fprintf(fp2,"%-15s %-15d",root->data,root->docfrequency); for(i=0;idocfrequency;i++) fprintf(fp2,"%-15d",root->docID[i]); fprintf(fp2,"\n"); WriteInvertedFile(root->rchild); //中序遍历二叉树右子树 } int id; struct IndexTree *rootW; void main(){ for(id=0;id<txtNum;id++){ FILE *fr; char rFileName[64]; sprintf(rFileName,"text\\P%d.txt",id); printf("%s\n",rFileName); fr=fopen(rFileName,"r"); rootW=CreatIndextree(rootW,fr,id); fclose(fr); } fp2=fopen("Index.txt","w"); WriteInvertedFile(rootW); fclose(fp2); }