9.26②试将折半查找算法改写成递归算法。
实现下列函数:int BinSearch(SSTable s, int low, int high, KeyType k);/* Index the element which key is k *//* in StaticSearchTable s. *//* Return 0 if x is not found. */静态查找表的类型SSTable定义如下:typedef struct {KeyType key;... ... // 其他数据域} ElemType;typedef struct {ElemType *elem;int length;} SSTable;int BinSearch(SSTable s, int low, int high, KeyType k)/* Index the element which key is k *//* in StaticSearchTable s. *//* Return 0 if x is not found. */{int mid=(low+high)/2;if(low>high)return 0;if(s.elem[mid].key==k)return mid;else if(s.elem[mid].key>k)return BinSearch(s,low,mid-1,k);else return BinSearch(s,mid+1,high,k);}9.31④试写一个判别给定二叉树是否为二叉排序树的算法,设此二叉树以二叉链表作存储结构。
且树中结点的关键字均不同。
实现下列函数:Status IsBSTree(BiTree t);/* 判别给定二叉树t是否为二叉排序树。
*//* 若是,则返回TRUE,否则FALSE */二叉树的类型BiTree定义如下:typedef struct {KeyType key;... ... // 其他数据域} ElemType;typedef struct BiTNode {ElemType data;BiTNode *lchild,*rchild;}BiTNode, *BiTree;Status IsBSTree(BiTree t)/* 判别给定二叉树t是否为二叉排序树。
*//* 若是,则返回TRUE,否则FALSE */{KeyType k;if(t==NULL)return TRUE;k=t->data.key;if(t->lchild==NULL&&t->rchild==NULL)return TRUE;if(t->lchild!=NULL&&t->rchild!=NULL){if(k>t->lchild->data.key&&k<t->rchild->data.key)if(IsBSTree(t->lchild)&&IsBSTree(t->rchild))return TRUE;return FALSE;}if(t->lchild!=NULL&&k>t->lchild->data.key)if(IsBSTree(t->lchild))return TRUE;if(t->rchild!=NULL&&k<t->rchild->data.key)if(IsBSTree(t->rchild))return TRUE;return FALSE;}9.33③编写递归算法,从大到小输出给定二叉排序树中所有关键字不小于x的数据元素。
要求你的算法的时间复杂度为O(log2n+m),其中n为排序树中所含结点数,m为输出的关键字个数。
实现下列函数:void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)); /* Output is to use visit(t->data); */二叉树的类型BiTree定义如下:typedef struct {KeyType key;... ... // 其他数据域} ElemType;typedef struct BiTNode {ElemType data;BiTNode *lchild,*rchild;}BiTNode, *BiTree;void OrderOut(BiTree t, KeyType x, void(*visit)(TElemType)) /* Output is to use visit(t->data); */{if(t==NULL)return;OrderOut(t->rchild,x,visit);if(t->data.key>=x)visit(t->data);OrderOut(t->lchild,x,visit);}9.44④已知某哈希表的装载因子小于1,哈希函数H(key)为关键字(标识符)的第一个字母在字母表中的序号,处理冲突的方法为线性探测开放定址法。
试编写一个按第一个字母的顺序输出哈希表中所有关键字的算法。
实现下列函数:void PrintKeys(HashTable ht, void(*print)(StrKeyType));/* 依题意用print输出关键字*/哈希表的类型HashTable定义如下:#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1typedef char StrKeyType[4];typedef struct {StrKeyType key;void *any;} HElemType;int hashsize[] = { 7,11,17,23,29,37,47 };typedef struct {HElemType elem[MAXLEN];int count;int sizeindex;} HashTable;void PrintKeys(HashTable ht, void(*print)(StrKeyType))/* 依题意用print输出关键字*/{int n,i,size;char c;size=hashsize[ht.sizeindex];for(c='A';c<='Z';c++){n=(c-'A')%size;i=n;while((n+1)%size!=i){if(ht.elem[n].key[0]==c)print(ht.elem[n].key);n=(n+1)%size;}}}9.45③假设哈希表长为m,哈希函数为H(x),用链地址法处理冲突。
试编写输入一组关键字并建造哈希表的算法。
实现下列函数:int BuildHashTab(ChainHashTab &H, int n, HKeyType es[]); /* 直接调用下列函数*/ /* 哈希函数:*/ /* int Hash(ChainHashTab H, HKeyType k); *//* 冲突处理函数:*/ /* int Collision(ChainHashTab H, HLink &p); */哈希表的类型ChainHashTab定义如下:#define NUM 7#define NULLKEY -1#define SUCCESS 1#define UNSUCCESS 0#define DUPLICATE -1typedef char HKeyType;typedef struct HNode {HKeyType data;struct HNode* next;}*HLink;typedef struct {HLink *elem; // 指针存储基址,动态分配数组int count; // 当前表中含有的记录个数int cursize; // 哈希表的当前容量}ChainHashTab; // 链地址哈希表int Hash(ChainHashTab H, HKeyType k) {// 哈希函数return k % H.cursize;}Status Collision(ChainHashTab H, HLink &p) {// 求得下一个探查地址pif (p && p->next) {p = p->next;return SUCCESS;} else return UNSUCCESS;}int BuildHashTab(ChainHashTab &H, int n, HKeyType es[])/* 直接调用下列函数*//* 哈希函数:*//* int Hash(ChainHashTab H, HKeyType k); *//* 冲突处理函数:*//* int Collision(ChainHashTab H, HLink &p); */{int i=0,l,flag;HLink p,node;while(es[i]!='\0'){l=Hash(H,es[i]);node=(HLink)malloc(sizeof(HNode));node->data=es[i];node->next=NULL;i++;if(H.elem[l]==NULL)H.elem[l]=node;else{flag=0;p=H.elem[l];if(p->data==node->data)flag=1;while(Collision(H,p))if(p->data==node->data){flag=1;break;};if(flag==0){p=H.elem[l];node->next=p;H.elem[l]=node;}}}}。