📄 main.c
字号:
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<ctype.h>
#include<stdlib.h>
#define maxb 2//文章数
typedef struct headnode headnode;
typedef struct key key;
typedef struct idxnode idxnode;
typedef struct normal normal;
struct idxnode
{//索引号结点
int idxnum[3];
idxnode *down;
};
struct key
{//关键词结点
char word[25];//一个单词最大长度定义为25
int idx;//索引号个数
idxnode *down;//指向索引号
key *right;//指向下一个关键词
};
struct headnode
{//索引表头结点
key *keyp;
int keynum;//关键词个数
};
struct normal
{//平凡词结点
char word[15]; //一个平凡单词数组,长度定义为15
normal *p;
};
//-------------------------------(一)建立平凡词表--readnormal()-----------------------------------------------------------------------
normal *readnormal(normal *L)
{//将平凡词表读入内存
int i,j;//j用来标记单词个数
char c;//检查'\n'
normal *a;
FILE *normalfp;
normalfp=fopen("normal.txt","r");
if(normalfp==NULL)
{
printf("cannot open normal.txt\n");
exit(0);
}
j=0;
while((c=fgetc(normalfp))!=EOF)
{
i=0;
a=(normal *)malloc(sizeof(normal));
// a->p = NULL;
while(c!='\n')
{
a->word[i]=c;
c=fgetc(normalfp);
i++;
}
if(i!=0)
{
a->word[i]='\0';
a->p=L->p;
L->p=a;//插入头结点之后
a=a->p;
j+=1;
}
}
fclose(normalfp);
/*a=L->p;
while(j>0 )
{
printf("%s\n",a->word);
a=a->p;
j-=1;
}*/
return L;
}
//------------------------------------(二)建立索引表-----------------------------------------------------------------------
int iskey(char *str,normal *norH)
{//判断是否为关键词
normal *h;
for(h=norH->p;h!=NULL;h=h->p)
{
if(!strcmp(h->word,str))
return 0;
}
return 1;
}//iskey
//-----------------------------------------------------------------------------------------------------------
key *locate(headnode *head,char *buf,int s)
{//s=0代表该关键词不在索引表内,s=1则表示在索引表内,且返回该关键词结点指针
int i,m;
key *q;
q=(key *)malloc(sizeof(key));
q=head->keyp;
for(i=0;i<head->keynum;i++,q=q->right)
{
m=strcmp(q->word,buf);
if(m==0)
break;
}
if(i==head->keynum)
{
s=0;
return NULL;
}
else
{
s=1;
return q;
}
}//locate
//-----------------------------------------------------------------------------------------------------------
headnode *build(normal *L,headnode *head)
{//返回索引表头结点
FILE *f;
char c;//在文件中取字符
int i,j,k,s;//书号,段号,行号,s在buf[]内做标记
char filename[maxb][6];//书名数组
char buf[25];//寄存单词
idxnode *dp;
key *rp,*p;
head->keyp=NULL;
head->keynum=0;
for(i=0;i<maxb;i++)
{//书名从0.txt开始
filename[i][0]='1'+i;
filename[i][1]='.';
filename[i][2]='t';
filename[i][3]='x';
filename[i][4]='t';
filename[i][5]='\0';
}
i=0;
do
{
printf("%s",filename[i]);
j=k=s=0;
f=fopen(filename[i],"r");
if(!f)
{
printf("openfile err");
exit(0);
}
c=fgetc(f);
while(c!=EOF)
{//在一篇文章内循环
if(c=='*')
{
j++;//'*'代表段首
}
else if(c=='\n')
k++;//一行结束
else if(isalpha(c))
{
if(isupper(c))//大写字母转换为小写
c = tolower(c);
buf[s++]=c;
}
else if((c==' '||c=='\n'||c==','||c=='.')&&buf[0]!='\0')
{
buf[s]='\0';
k++;
if(iskey(buf,L))
{
dp=(idxnode *)malloc(sizeof(idxnode));
dp->idxnum[0]=i+1;
dp->idxnum[1]=j;
dp->idxnum[2]=k;
dp->down=NULL;
p=locate(head,buf,s);//s作为是否在索引表内的标记
if(p == NULL)
{//不在索引表内
rp=(key *)malloc(sizeof(key));
strcpy(rp->word,buf);
rp->down=dp;
rp->idx=1;
rp->right=head->keyp;
head->keyp=rp;
head->keynum++;
}
else
{//在索引表内
dp->down=p->down;
p->down=dp;
p->idx++;
}
}
s=0;//buf为平凡词,则重新取词
buf[s]='\0';
}
c=fgetc(f);
}//while(c!=EOF)
if(fclose(f))
{
printf("close file error");
exit(0);//关闭未成功
}
i++;//下一本书
}while(i<maxb);
return head;
}
//-----------------------------------------------------------------------------------------------------------
void putout(headnode *head)
{
FILE *f;
int i,j;
idxnode *dp;
key *rp;
dp=(idxnode *)malloc(sizeof(idxnode));
rp=(key *)malloc(sizeof(key));
rp=head->keyp;
f=fopen("idxlist.txt","w");
for(i=0;i<(head->keynum);i++,rp=rp->right)
{
fprintf(f,"%s\n",rp->word);
dp=rp->down;
for(j=0;j<rp->idx;j++,dp=dp->down)
fprintf(f,"%d,%d,%d\n",dp->idxnum[0],dp->idxnum[1],dp->idxnum[2]);
}
if(fclose(f))
exit(0);//关闭未成功
}
//-----------------------------打印文章------------------------------------------------------
void prt(int i,int j)
{//打印出含有关键词的文字段
char fn[6];
FILE *f;
char c;
int p;
fn[0]='0'+i;
fn[1]='.';
fn[2]='t';
fn[3]='x';
fn[4]='t';
fn[5]='\0';
f=fopen(fn,"r");
if(!f)
{
printf("openfile error");
exit(0);
}
for(p=0;p<j;)
{
c=fgetc(f);
if(c=='*')
p++;
}
for(c=fgetc(f);c!='*'&&c!=EOF;c=fgetc(f))
printf("%c",c);
if(fclose(f))
exit(0);//关闭未成功
return;
}
//--------------------------------(三)查找关键词---------------------------------------------------------------------------
void searchkey(normal *L,headnode *head)
{
int need,i,num,b=0;
char qustword[25];//max 25
idxnode *dp;
key *rp;
dp=(idxnode *)malloc(sizeof(idxnode));
rp=(key *)malloc(sizeof(key));
printf("是否需要搜索关键词(yes=1/no=0):");
scanf("%d",&need);
while(need)
{//在索引表中逐个查找
printf("请输入要查找的单词:");
scanf("%s",qustword);
if(iskey(qustword,L))
{
rp=locate(head,qustword,b);
if(rp == NULL )
printf("该词不在关键词词库内\n");
else
{
i=rp->idx;
printf("%s有%d个搜索结果\n是否需要显示索引号(yes=1/no=0):",qustword,i);
scanf("%d",&need);
if(need)
{
num=rp->idx;
dp=rp->down;
for(i=0;i<num;i++,dp=dp->down)
{
printf("\n书号,段号,行号\n%d,%d,%d\n",dp->idxnum[0],dp->idxnum[1],dp->idxnum[2]);
prt(dp->idxnum[0],dp->idxnum[1]);
}
}//if
}//else
}//if
else
printf("该词为平凡词\n");
printf("是否继续搜索(yes=1/no=0):");
scanf("%d",&need);
}//while(need)
return;
}
//-----------------------------------------------------------------------------------------------------------
void main()
{
headnode *head;
normal *norH;
head=(headnode *)malloc(sizeof(headnode));
norH=(normal *)malloc(sizeof(normal));
norH->p = NULL;
norH=readnormal(norH);
head=build(norH,head);
putout(head);
searchkey(norH,head);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -