#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define MaxKeyNum 2500 //索引表的最大容量
#define MaxWordNum 200 //常用词表的最大容量
#define zj 100 //增量
#define OK 1
#define OVERFLOW -2
using namespace std;
typedef int Status;
typedef struct
{
char item[MaxWordNum][55];//存放常用词
int last; //常用词个数
}WordListType; //常用词表类型
typedef struct BNode
{
char num[5]; //存放书号
struct BNode *next;
}BNode,*Link_BN;
typedef struct
{
char key[20]; //存放关键词
Link_BN bnolist;//存放书号索引的链表
}idxTermType;
typedef struct
{
idxTermType *elem;
int length;
int listsize;
}IdxListType; //索引表类型
WordListType wdlist;
int get_word() //读取常用词
{
FILE *f;
int i=0;
f=fopen("常用词表.txt","r");
if (f==NULL) return 0;
while (fgets(wdlist.item[i++],100,f)!=NULL)
{
wdlist.item[i-1][strlen(wdlist.item[i-1])-1]='\0';
}
fclose(f);
wdlist.last=i;
return 1;
}
int is_word(char *a) //判断单词是否为常用词
{
int start=0,end=wdlist.last-2,mid,k;
//for(int i=0;i<e;i++)
//cout<<wdlist.item[i]<<endl;
mid=(start+end)/2;
while ((k=strcmp(a,wdlist.item[mid]))!=0)
{
if (k>0) start=mid+1;
else end=mid-1;
if (start>end) return -1;
mid=(start+end)/2;
}
return 1;
}
int write_num(Link_BN l,FILE *f) //读入书号到索引表
{
Link_BN p;
int flag=0;
p=l;
while (p->next)
{
if (flag++)
fputs(",",f);
fputs(p->next->num,f);
p=p->next;
}
fputs("\n",f);
return OK;
}
int Init_Idxlist(IdxListType &l) //初始化索引链表
{
l.elem=(idxTermType *)malloc(MaxKeyNum*sizeof(idxTermType));
if (!l.elem) exit(OVERFLOW);
l.length=0;
l.listsize=MaxKeyNum;
return OK;
}
int Init_BNList(Link_BN &l) //初始化书号链表
{
l=(Link_BN)malloc(sizeof(BNode));
if (!l) exit(OVERFLOW);
l->next=NULL;
return OK;
}
int Insert_BNList(Link_BN &l,char c[]) //往书号链表中插入书号
{
Link_BN p,q;
q=l;
p=(Link_BN)malloc(sizeof(BNode));
if (!p) exit(OVERFLOW);
p->next=NULL;
strcpy(p->num,c);
while (q->next)
{
if (strcmp(q->next->num,p->num)<0)
{
if (q->next) q=q->next;
}
else break;
}
p->next=q->next;
q->next=p;
return OK;
}
int Insert_Idxlist(IdxListType &l,char s[],char c[]) //将书号和关键字存入索引链表
{
int i,j,k=1;
idxTermType *newbase;
for (i=0;i<l.length;i++)
{
if (strcmp(l.elem[i].key,s)==0)
{
k=0;
break;
}
if (strcmp(l.elem[i].key,s)>0) break;
}
if (k)
{
for (j=l.length-1;j>=i;j--)
{
strcpy(l.elem[j+1].key,l.elem[j].key);
l.elem[j+1].bnolist=l.elem[j].bnolist;
}
strcpy(l.elem[i].key,s);
Init_BNList(l.elem[i].bnolist);
l.length++;
if (l.length==l.listsize)
{
newbase=(idxTermType *)realloc(newbase,(l.listsize+zj)*sizeof(idxTermType));
if (!l.elem) exit(OVERFLOW);
l.elem=newbase;
l.listsize+=zj;
}
}
Insert_BNList(l.elem[i].bnolist,c);
return OK;
}
int get_book(IdxListType &l) //读取书目表中的内容
{
FILE *f;
int i,j;
char s[200],c[4],k[20];
f=fopen("书目表.txt","r");
while (fgets(s,200,f)!=NULL)
{
j=0;
for (i=0;s[i]!=' ';i++)
c[i]=s[i];
c[i]='\0';
for (i=4;i<strlen(s);i++)
{
if (s[i]!=' ')
{
k[j++]=s[i];
}
else
{
k[j]='\0';
j=0;
strlwr(k);
if (is_word(k)==-1)
{
Insert_Idxlist(l,k,c);
}
}
}
k[j-1]='\0'; //处理行尾的那个单词
strlwr(k);
if (is_word(k)==-1)
{
Insert_Idxlist(l,k,c);
}
}
fclose(f);
return OK;
}
void write_key(IdxListType &l)
{
int i;
FILE *f;
f=fopen("关键词索引表.txt","w");
fputs("关键词\t\t书号索引\n",f);
for (i=0;i<l.length;i++)
{
fputs(l.elem[i].key,f); //写入关键词
if (strlen(l.elem[i].key)<8)
fputs("\t\t",f);
else
fputs("\t",f);
write_num(l.elem[i].bnolist,f); //写入书号
}
fclose(f);
}
int main(int argc, char *argv[])
{
IdxListType txt;
get_word();
Init_Idxlist(txt);
get_book(txt);
write_key(txt);
return 0;
}
//读入文件
/*
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int main(int argc, char *argv[])
{
FILE *f;
char s[200];
f=fopen("shumu.txt","w");
while((strlen(gets(s)))!=0)
{
fputs(s,f);
fputs("\n",f);
}
fclose(f);
return 0;
}
*/
//读出文件
/*
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int my_cmp(const void *a,const void *b)
{
return (char *)a-(char*)b;
}
int main(int argc, char *argv[])
{
FILE* f;
FILE* p;
char s[100][15];
int i=0,n;
p=fopen("word1.txt","w");
f=fopen("word.txt","r");
if(f==NULL)
{
printf("error");
exit(0);
}
while(fgets(s[i++],15,f)!=NULL);
fclose(f);
n=i;
qsort(s,n,sizeof(s[0]),my_cmp);
if(p==NULL)
{
printf("error");
exit(0);
}
for(i=0;i<n;i++)
{
fputs(s[i],p);
}
return 0;
}
*/
数据结构_索引表
最新推荐文章于 2022-08-21 13:35:06 发布