五:查找表的初始化操作及应用

内容

    • 结点类型
    • 创建表: Create(&ST,n)
    • 销毁表: Destroy(&ST)
    • 读表元: Get(ST,pos)
    • 插入: Insert(&ST,e)
    • 删除: Delete(&ST,K)
    • 顺序查找: Search(ST,K)
    • 折半查找
    • 索引顺序查找

结点类型

typedef struct{
		ElemType   *elem;     //数组的基地址
		int        length;   //表中记录的个数
}SSTable;

创建表: Create(&ST,n)

在这里插入代码片

销毁表: Destroy(&ST)

在这里插入代码片

读表元: Get(ST,pos)

在这里插入代码片

插入: Insert(&ST,e)

在这里插入代码片

删除: Delete(&ST,K)

在这里插入代码片

顺序查找: Search(ST,K)

int  Search(SSTable  ST, KeyType  K)  {
  //从表尾开始,顺序查找,  查找成功返回元素的位置下标
 //查找失败,返回0
	int i=ST.length;
  while(i>0 && ST.elem[i].key!=K) i--;
  return  i ;
}//search
int  Search(SSTable  ST, KeyType  K)   {
      //带哨兵的检索,从表尾开始,顺序查找
   //查找成功返回元素的位置下标;查找失败,返回0
	int i=ST.length;
	ST.elem[0].key=K;
	while(ST.elem[i].key!=K) i--;
	return i;
}

折半查找

int Search_Bin(SSTable ST, KeyType K){
	int low=1, high=ST.length;
	int mid;
	while(low<=high){
		mid=(low+high)/2;
		if(K<ST[mid].key)
			high=mid-1; 	//在左区间继续查找
		else if(K>ST[mid].key)
			low=mid+1; 	//在右区间继续查找
		else  return mid;	//查找成功的出口
   }//while
   return 0;      //查找失败的出口
}//Search_Bin

索引顺序查找

typedef struct{
		KeyType 	key;		//块内最大键值
		int 		stadr;    //块起始地址
}IndexItem;

typedef struct{
		IndexItem	*elem;	//索引表基地址
		int		length;	//索引表长度
}IndexTable;
int search_Idx( SSTable  ST,  IndexTable  ID,  KeyType  K ) {
	low=0;high=ID.length-1; found=FALSE;
	if(K>ID.elem[high].key) return 0;
	while(low<=high && !found){//折半查找索引表
		mid=(low+high)/2;
		if(K<ID.elem[mid].key) high=mid-1;
		else if(K>ID.elem[mid].key) low=mid+1;
		else {found=TRUE; low=mid;}
	}//while       *** 下一步顺序查找ST表的第low块 ***
	s=ID.elem[low].stadr;  //确定ST表的查找区间s..t
	if(low<ID.length-1) t=ID.elem[low+1].stadr-1;
  else  t=ST.length;  //low==ID.length-1最后一块
	for(i=s; i<=t&&ST.elem[i].key!=K; i++);//查找ST表
  if(k<=t) return i; //查找成功,返回目标在ST表的下标i
	else return 0;     //查找失败, 返回0
}//search_Idx

你可能感兴趣的:(#,大二上数据结构,数据结构,c++,c语言)