📄 informationretrieval.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<math.h>
struct Ttree
{
char data[20];
double weight;
double num; //一篇文献中的某一索引词出现的次数
double max; //一篇文献的总字数
double n; //索引词出现在几个文档中
struct Ttree *lchild; //左儿子
struct Ttree *rchild; //右儿子
};
struct Ttree *rootW=NULL;
double MF=6;
FILE *fp=fopen("D:\\mm.txt","w");
Ttree *createTtree(Ttree *root,FILE *fp){
int i=0,t=0;
struct Ttree *p,*q; //定义中间指针变量
char ch;
p=(Ttree*)malloc(sizeof(Ttree)); //申请新的存储空间
p->data[0]='\0';
if(fp==NULL)
{
printf("\nCannot open file strike any key exit!");
return NULL;
}
ch=fgetc(fp);
while((ch!=EOF)&&(t==0))
{ if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')){
if(ch<='Z') ch=ch+32;
p->data[i]=ch;
i++;
}
else{ if(p->data[0]=='\0'){ch=fgetc(fp);continue;}
p->data[i]='\0';
p->max++;
p->n=1;
p->num=1;
i=0;
t=1;
p->lchild=NULL;
p->rchild=NULL; //初始化头节点的左右儿子为空指针
root=p;
}
ch=fgetc(fp);
}
q=(Ttree*)malloc(sizeof(Ttree));
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';
root->max++;
q->n=1;
q->num=1;
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)<0){ //如果待插入的节点的值小于当前节点的值,
if(p->lchild==NULL) // 且其左子树为空
{p->lchild=q; // 则插入
p=NULL;} //并置当前节点为空,退出当前的while循环
else
p=p->lchild;
} // 否则继续访问其左子树
else if(strcmp(q->data,p->data)>0){ //如果待插入的节点的值大于当前节点的值
if(p->rchild==NULL) // 且其右子树为空
{p->rchild=q; // 则插入
p=NULL;} //并置当前节点为空,退出当前的while循环
else
p=p->rchild;
} // 否则继续访问其右子树
else {p->num++;p=NULL; }
} //while
q=(Ttree*)malloc(sizeof(Ttree));
q->data[0]='\0';
} //else
}//while
return root;
}
/*二叉树查找*/
Ttree *SearchBinTtree(Ttree *rootx,Ttree *rooty){
if(rootx==NULL) return NULL;
if(strcmp(rootx->data,rooty->data)==0) {rooty->n++;return rootx;}
if(strcmp(rootx->data,rooty->data)>0) return SearchBinTtree(rootx->lchild,rooty);
return SearchBinTtree(rootx->rchild,rooty);
}
/*计算在词出现在几个文档中*/
void InMidThread(Ttree *rooty,Ttree *rootx){
if(rooty==NULL) return;
InMidThread(rooty->lchild,rootx); //中序遍历二叉树左子树 ;
SearchBinTtree(rootx,rooty);
InMidThread(rooty->rchild,rootx); //中序遍历二叉树右子树 ;
}
/*计算权值*/
void InThread(Ttree *root,Ttree *Mroot){
if(root==NULL) return;
InThread(root->lchild,Mroot); //中序遍历二叉树左子树 ;
root->weight=(root->num/Mroot->max)*log(MF/root->n);
InThread(root->rchild,Mroot); //中序遍历二叉树右子树 ;
}
//对权值进行排序
void weight(Ttree *root,Ttree *r,Ttree *p,Ttree *q){
if(root==NULL) return;
weight(root->lchild,r,p,q); //中序遍历二叉树左子树 ;
if(r==NULL)
{p=(Ttree*)malloc(sizeof(Ttree)); //申请新的存储空间
p->data=root->data;
p->weight=root->weight;
p->num=root->num;
p->n=root->n;
p->lchild=NULL;
p->rchild=NULL; //初始化头节点的左右儿子为空指针
rootW=p; //指针rootW指向头节点
r=p;}
else{
q=(Ttree*)malloc(sizeof(Ttree));
q->data=root->data;
q->weight=root->weight;
q->num=root->num;
q->n=root->n;
q->lchild=NULL;
q->rchild=NULL; //初始化头节点的左右儿子为空指针
if(p==NULL) p=rootW; //如果要有新节点插入则,p重新指向根节点,因为 每次比较都要从根节点开始
while(p!=NULL) //寻找待插入节点的位置
{
if(q->weight>p->weight){ //如果待插入的节点的值小于当前节点的值,
if(p->lchild==NULL) // 且其左子树为空
{p->lchild=q; // 则插入
p=NULL;} //并置当前节点为空,退出当前的while循环
else
p=p->lchild;} // 否则继续访问其左子树
else{ //如果待插入的节点的值大于当前节点的值
if(p->rchild==NULL) // 且其右子树为空
{p->rchild=q; // 则插入
p=NULL;} //并置当前节点为空,退出当前的while循环
else
p=p->rchild;} // 否则继续访问其右子树
}//while
} //else
weight(root->rchild,r,p,q);
}
//输出权值
void ThreadWeight(Ttree *root){
if(root==NULL) return;
ThreadWeight(root->lchild); //中序遍历二叉树左子树 ;
fprintf(fp,"%s\t%f\t%f\t%f\t\n",root->data,root->weight,root->num,root->n);
ThreadWeight(root->rchild); //中序遍历二叉树右子树 ;
}
void main(){
FILE *fp1,*fp2,*fp3,*fp4,*fp5,*fp6;
Ttree *root1,*root2,*root3,*root4,*root5,*root6,*r=NULL,*p,*q;
fp1=fopen("d:\\p1.txt","r");
root1=createTtree(root1,fp1);
fclose(fp1);
fp2=fopen("d:\\p2.txt","r");
root2=createTtree(root2,fp2);
fclose(fp2);
fp3=fopen("d:\\p3.txt","r");
root3=createTtree(root3,fp3);
fclose(fp3);
fp4=fopen("d:\\p4.txt","r");
root4=createTtree(root4,fp4);
fclose(fp4);
fp5=fopen("d:\\p5.txt","r");
root5=createTtree(root5,fp5);
fclose(fp5);
fp6=fopen("d:\\p6.txt","r");
root6=createTtree(root6,fp6);
fclose(fp6);
InMidThread(root1,root2);
InMidThread(root1,root3);
InMidThread(root1,root4);
InMidThread(root1,root5);
InMidThread(root1,root6);
InMidThread(root2,root1);
InMidThread(root2,root3);
InMidThread(root2,root4);
InMidThread(root2,root5);
InMidThread(root2,root6);
InMidThread(root3,root1);
InMidThread(root3,root2);
InMidThread(root3,root4);
InMidThread(root3,root5);
InMidThread(root3,root6);
InMidThread(root4,root1);
InMidThread(root4,root2);
InMidThread(root4,root3);
InMidThread(root4,root5);
InMidThread(root4,root6);
InMidThread(root5,root1);
InMidThread(root5,root2);
InMidThread(root5,root3);
InMidThread(root5,root4);
InMidThread(root5,root6);
InMidThread(root6,root1);
InMidThread(root6,root2);
InMidThread(root6,root3);
InMidThread(root6,root4);
InMidThread(root6,root5);
fprintf(fp,"第1篇文档\n");
InThread(root1,root1);
weight(root1,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第2篇文档\n");
InThread(root2,root2);
weight(root2,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第3篇文档\n");
InThread(root3,root3);
weight(root3,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第4篇文档\n");
InThread(root4,root4);
weight(root4,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第5篇文档\n");
InThread(root5,root5);
weight(root5,r,p,q);
ThreadWeight(rootW);
fprintf(fp,"第6篇文档\n");
InThread(root6,root6);
weight(root6,r,p,q);
ThreadWeight(rootW);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -