⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 library.cpp

📁 数据结构-次索引的建立
💻 CPP
字号:
#include<stdio.h>
#include<iostream.h>
#include<string.h>
#include<stdlib.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MaxBookNum 7
#define MaxKeyNum 10

typedef int status;

typedef struct{
	char *ch;
	int length;
} HString;

typedef struct{
  char booknum[3];
  char bookname[50];
} ElemType;

typedef struct{
  ElemType *elem;
  int length;
} WordListType;

typedef struct LNode{
 char ch[3];
 struct LNode *next;
} LNode,*LinkType;

typedef struct{
 LinkType head,tail;
 int size;
} LinkList;

typedef struct{
  HString key;
  LinkList bnolist;
}IdxTermType;

typedef struct{
	IdxTermType *item;
	int last;
}IdxListType;

status InitList(LinkList &bnolist);
status MakeNode(LinkType p,char bno[]);
status Append(LinkList bnolist,LinkType p);
status Locate(IdxListType &idxlist,HString wd,int &b);
status InsertNewKey(int i,HString wd);
status InsertBook(IdxListType &idxlist,int i,char bno[]);
void GetWord(char *bna,HString &wd);
void SearchInfor();
void CreateBL();


IdxListType idxlist;
WordListType bookfile;

status InitList(LinkList &bnolist)
{ bnolist.head=new(LNode);
  bnolist.tail=bnolist.head;
  bnolist.tail->next=NULL;
  bnolist.size=0;
  return OK;
}

status MakeNode(LinkType p,char bno[])
{ p=new(LNode);
  *p->ch=*bno;
  p->next=NULL;
  return OK;
}

status Append(LinkList bnolist,LinkType p)
{ bnolist.tail->next=p;
  bnolist.tail=p;
  bnolist.size++;
  return OK;
}

status Locate(IdxListType &idxlist,HString wd,int &b)
{ int i,m;
  for(i=idxlist.last-1;(m=strcmp(idxlist.item[i].key.ch,wd.ch))>0&&i>=0;--i);
  if(m==0)  {b=OK;return i;}
    else{b=ERROR;return i+1;}
}

status InsertNewKey(int i,HString wd)
{ for(int j=idxlist.last-1;j>=i;--j)
     idxlist.item[j+1]=idxlist.item[j];
  idxlist.item[i].key.length=strlen(wd.ch);
  idxlist.item[i].key.ch=new char[strlen(wd.ch)+1];
  //idxlist.item[i].key.ch=wd.ch;
  strcpy(idxlist.item[i].key.ch,wd.ch);
  cout<<"idx="<<idxlist.item[i].key.ch<<endl;
  InitList(idxlist.item[i].bnolist);
  ++idxlist.last; 
  return OK;
}

status InsertBook(IdxListType &idxlist,int i,char bno[])
{ LinkType p;
  p=new(LNode);
  strcpy(p->ch,bno);
  Append(idxlist.item[i].bnolist,p);
  return OK;
}


void GetWord(char *bna,HString &wd)
{ strcpy(wd.ch,bna);
  wd.length=strlen(bna);
}


void SearchInfor()
{ char *In="a";
  HString wd={"\0",0};
  cout<<"请输入关键词:";
  cin>>In;
  if('a'<=In[0]&&In[0]<='z')
	  In[0]=In[0]-32;
  int b=OK; 
  wd.length=strlen(In);
  strcpy(wd.ch,In);
  int i=Locate(idxlist,wd,b);
  if(b==OK)
  { LinkType q=idxlist.item[i].bnolist.head->next;
    while(q)
	{ cout<<"书号:"<<q->ch<<"  书名:";
	  while(bookfile.elem)
	  {if(!strcmp(bookfile.elem->booknum,q->ch))
	  { cout<<bookfile.elem->bookname;break;}
	    bookfile.elem++;
	  }
	  q=q->next;
	}
  }
  else cout<<"查找记录为空!"<<endl;
}

void CreateBL()
{ HString wd={"\0",0};
  bookfile.length=MaxBookNum;
  bookfile.elem=(ElemType *)malloc(bookfile.length*sizeof(ElemType));
  int i=0,j,k,l;
  char bna[7][15]={"\0","\0","\0","\0","\0","\0","\0"};
  FILE *fp;
  fp=fopen("bookfile.txt","r");
  while(!feof(fp))
  { char bna[7][15]={"\0","\0","\0","\0","\0","\0","\0"};
	j=k=l=0;
	//fread(&bookfile.elem[i],sizeof(ElemType),1,fp);
    fgets(bookfile.elem[i].booknum,4,fp);puts(bookfile.elem[i].booknum);
    fgets(bookfile.elem[i].bookname,50,fp);puts(bookfile.elem[i].bookname);
	while(bookfile.elem[i].bookname[j]==' ') j++;
    while(bookfile.elem[i].bookname[j]!='\n')
	{ if(bookfile.elem[i].bookname[j]!=' ') 
	{ bna[k][l]=bookfile.elem[i].bookname[j];l++;}
       else{ l=0;
	         if(!strcmp(bna[k],"an")||!strcmp(bna[k],"An")||!strcmp(bna[k],"a")||!strcmp(bna[k],"A")||!strcmp(bna[k],"of")||!strcmp(bna[k],"to")||!strcmp(bna[k],"the")||!strcmp(bna[k],"The")||!strcmp(bna[k],"and"))
				    k=k;
			   else k++;
	   }
     j++;
	}
   for(j=0;j<=k;j++)
   { wd.ch=bna[j];cout<<"bna["<<j<<"]="<<bna[j]<<endl;
     wd.length=strlen(bna[j]);
	 //GetWord(bna[j],wd);
     int Inspos,b=OK;
	 if(i==0&&j==0)
	 { Inspos=0;
	   b=ERROR;
	   idxlist.item=new IdxTermType[MaxKeyNum];
	   idxlist.last=0;
	 }
       else Inspos=Locate(idxlist,wd,b);
     if(b==OK)
        InsertBook(idxlist,Inspos,bookfile.elem[i].booknum);
      else { InsertNewKey(Inspos,wd);
             InsertBook(idxlist,Inspos,bookfile.elem[i].booknum);
	  }
   }
   for(k=0;k<7;k++)
	   strcpy(bna[k],"\0");
   i++;
 }
  
 fclose(fp);
}


int main()
{ char ch;
  CreateBL();
  do{ SearchInfor();
      cout<<"按'Q'或'q'键结束查找,其他键继续查找:";
	  cin>>ch;
  }while(ch!='Q'&&ch!='q');
 return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -