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

📄 algo4-4.cpp

📁 严蔚敏《数据结构》所有代码,配合高一凡的《数据结构》算法实现及解析使用效果更佳。
💻 CPP
字号:
 // algo4-4.cpp 根据algo4-3.cpp产生的文件,索引查询图书
 #include"c1.h"
 typedef int ElemType;
 #include"c2-5.h"
 #include"bo2-6.cpp"
 #include"c4-2.h"
 #include"bo4-2.cpp"

 #define MaxBookNum 10 // 假设只对10个书名建索引表
 #define MaxKeyNum 25 // 索引表的最大容量(关键词的最大数目)
 #define MaxLineLen 46 // 书名的最大长度

 struct IdxTermType // 索引项类型
 {
   HString key; // 关键词(堆分配类型,c4-2.h)
   LinkList bnolist; // 存放书号索引的链表(c2-5.h)
 };

 struct IdxListType // 索引表类型(有序表)
 {
   IdxTermType item[MaxKeyNum+1]; // 索引项数组类型
   int last; // 关键词的个数
 };

 struct BookTermType // 书目项类型
 {
   char bookname[MaxLineLen+1]; // 书名串(包括'\0')
   int bookno; // 书号
 };

 struct BookListType // 书目表类型(有序表)
 {
   BookTermType item[MaxBookNum]; // 书目项数组类型
   int last; // 书目的数量
 };

 void main()
 {
   FILE *f; // 任何时间最多打开一个文件
   IdxListType idxlist; // 索引表
   BookListType booklist; // 书目表
   char buf[MaxLineLen+5]; // 当前书目串(包括书号和'\0')
   HString ch; // 索引字符串
   int BookNo; // 书号
   Link p; // 链表指针
   int i,j,k,flag=1; // flag是继续查询的标志
   InitString(ch); // 初始化HString类型的变量
   if(!(f=fopen("BookIdx.txt","r"))) // 打开书名关键词索引表文件
     exit(OVERFLOW);
   fscanf(f,"%d",&idxlist.last); // 书名关键词个数
   for(k=0;k<idxlist.last;k++) // 把关键词文件的内容拷到idxlist中
   {
     fscanf(f,"%s",buf);
     i=0;
     while(buf[i])
       buf[i++]=tolower(buf[i]); // 字母转为小写
     InitString(idxlist.item[k].key);
     StrAssign(idxlist.item[k].key,buf);
     InitList(idxlist.item[k].bnolist); // 初始化书号链表,bo2-6.cpp
     fscanf(f,"%d",&i);
     for(j=0;j<i;j++)
     {
       fscanf(f,"%d",&BookNo);
       MakeNode(p,BookNo); // 产生新的书号结点,bo2-6.cpp
       p->next=NULL; // 给书号结点的指针域赋值
       Append(idxlist.item[k].bnolist,p); // 在表尾插入新的书号结点,bo2-6.cpp
     }
   }
   fclose(f);
   if(!(f=fopen("BookInfo.txt","r"))) // 打开书目文件
     exit(FALSE);
   i=0;
   while(fgets(buf,MaxLineLen,f))
   { // 把书目文件的内容拷到booklist中
     booklist.item[i].bookno=atoi(buf); // 前几位数字为书号
     strcpy(booklist.item[i++].bookname,&buf[4]); // 将buf由书名开始的字符串拷贝到booklist中
   }
   booklist.last=i;
   while(flag)
   {
     printf("请输入书目的关键词(一个):");
     scanf("%s",buf);
     i=0;
     while(buf[i])
       buf[i++]=tolower(buf[i]); // 字母转为小写
     StrAssign(ch,buf);
     i=0;
     do
     {
       k=StrCompare(ch,idxlist.item[i++].key); // bo4-2.cpp
     }while(k&&i<=idxlist.last);
     if(!k) // 索引表中有此关键词
     {
       p=idxlist.item[--i].bnolist.head->next; // p指向索引表中此关键词相应链表的首元结点
       while(p)
       {
         j=0;
         while(j<booklist.last&&p->data!=booklist.item[j].bookno) // 在booklist中找相应的书号
           j++;
         if(j<booklist.last)
           printf("%3d %s",booklist.item[j].bookno,booklist.item[j].bookname);
         p=p->next; // 继续向后找
       }
     }
     else
       printf("没找到\n");
     printf("继续查找请输入1,退出查找请输入0:");
     scanf("%d",&flag);
   }
 }

⌨️ 快捷键说明

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