| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 564 人关注过本帖
标题:问题标签用户 求助!用二叉树构建倒排索引文件出现错误
只看楼主 加入收藏
eileen9049
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-6-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
问题标签用户 求助!用二叉树构建倒排索引文件出现错误
目录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);
}
搜索更多相关主题的帖子: include 二叉树 标签 用户 字母 
2014-06-14 16:23
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
收藏
得分:20 
二叉树方面问题不是很懂

我不是砖家,要努力成为砖家。
2014-06-15 09:18
快速回复:问题标签用户 求助!用二叉树构建倒排索引文件出现错误
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017768 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved