數據結構_索引表

#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;
}
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章