【编程练习题】
本章编程练习题中的静态查找表和索引查找表的类型定义如下: 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
|