【编程练习题】


  本章编程练习题中的静态查找表和索引查找表的类型定义如下:
  typedef struct
  {
   KeyType key;
  } SElemType; // 查找表的元素类型

  typedef struct
  {
   SElemType *elem;
   int length;
   int listsize;
  } SSTable; // 静态查找表

 1. 假设顺序表按关键字自大至小有序,试改写9.2.2节中的顺序查找算法,将监视哨设在高下标端。然后画出描述此查找过程的判定树,分别求出等概率情况下查找成功和不成功时的平均查找长度。
  int SqSearch(SSTable a, KeyType kval)
 // 在数据元素依关键字自大至小排列的有序表中进行顺序查找,要求"监视哨"
 // 设在表尾,若在 a 中存在关键字和 kval 相同的元素,则返回它在表中
 // 位置(1..a.length), 否则返回 0。已知为查找表分配的空间 > a.length+1

 2. 试编写利用折半查找确定记录所在块的分块查找算法。索引顺序查找表的类型说明如下所示:
  typedef struct
  {

   KeyType maxkey;
   int stadr;
  } indexItem; // 索引项
  typedef struct
  {

   indexItem idx[maxlen];
   int length;
  } indexTable; // 索引表 typedef struct
  {
   SSTable sa;
   indexTable id;
  }indexSSTable; // 索引顺序查找表

  int IndexBinSearch(indexSSTable ss, KeyType kval)
 // 在索引顺序查找表 ss 中查找关键字等于给定值 kval 的数据元素
 // (折半查找索引),若存在,则返回它在顺序表中的位置,否则返回 0

 3. 已知一非空有序表,表中记录按关键字递增排列,以不带头结点的单循环链表作存储结构,外设两个指针 h 和 t,其中 h 始终指向关键字最小的结点,t 则在表中浮动,其初始位置和 h 相同,在每次查找之后指向刚查到的结点。查找算法的策略是:首先将给定值 K 和 t->key 进行比较,若相等,则查找成功;否则因 K 小于或大于 t->key 而从 h 所指结点或 t 所指结点的后继结点起进行查找。试按上述查找过程编写查找算法;
  LinkList LListSearch(LinkList h, LinkList &t, KeyType kval, int &len)
 // 依题意,在升序的单循环链表中查找关键字等于 kval 的元素,若存在,
 // 则返回指向该元素结点的指针,否则返回 NULL。指针 h 始终指向关键字最小的
 // 结点,而指针 t 则在算法中动态修改,始终指向上一次查找结束时的结点(即:
 // 若查找成功,则指向找到的结点,若不成功,则指向其关键字 > kval 的结点,
 // 但如果 kval>最后一个结点的关键字,则查找结束时指针 t 指向第一个结点),
 // len 返回本次查找过程中kval 和关键字比较的次数,
 // 注意:和同一个关键字进行的比较次数只统计一次。

 4. 试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构。且树中结点的关键字均不同。
  bool BiSortTree( BiTree t )
 // 以二叉链表作二叉查找树的存储结构,若以 t 为根
 // 指针的二叉树是二叉查找树,则返回 true, 否则返回 false

 
【编程练习题】