2 asdfghjkl9049 asdfghjkl9049 于 2014.06.14 16:11 提问

求助!用二叉树构建倒排索引文件出现错误

目录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);

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!