数据结构伪C代码:9.查找

typedef float KeyType;
typedef int   KeyType;
typedef char *KeyType;
//---------------------顺序查找表的顺序存储结构------------------
typedef struct{
	  ElemType *elem;  //数据元素存储空间基址,建表时按实际长度分配,0号单元留空
	  int    length;   //表长度
	}SSTable;
//算法9.1
int Search_Seq(SSTable ST,KeyType key){
	//在顺序表ST中顺序查找其关键字等于key的数据元素。
	//若找到,则函数值为该元素在表中的位置,否则为0
	   ST.elem[0].key=key;
	   for(i=ST.length;!EQ(ST.elem[i].key,key),i--);//从后往前找
	   return i;                                   //找不到时,i为0
	}
//算法9.2
int Search_Bin(SSTable ST,KeyType key){
	 //在有序表ST中折半查找其关键字等于key的数据元素。
	 //若找到,则函数值为该元素在表中的位置,否则为0
	   low=1;
	   high=ST.length;
	   while(low<=high){
	   	  min=(low+high)/2;
	   	  if(EQ(key,ST.elem[mid].key))
	   	  	  return mid;
	   	  else if(LT(key,ST.elem[mid].key)) 
	   	  	  high=mid-1;
	   	  	 else
	   	  	 	low=mid+1;
	   	}
	  return 0;
	}
//算法9.3
void SecondOptimal(BiTree &T,ElemType R[],float sw[].int low,int high){
	//由有序表R[low..high]及其累计权值表sw(其中,sw[0]==0)递归构造次优查找树T
	 i=low;
	 min=abs(sw[high]-sw[low]);
	 dw=sw[high]+sw[low-1];
	 for(j=low+1;j<=high;j++)
	   if(abs(dw-sw[j]-sw[j-1])<min){
	   	   i=j;
	   	   min=abs(dw-sw[j]-sw[j-1]);
	   	}
	 T=(BiTree)malloc(sizeof(BiTNode));
	 T->data=R[i];
	 if(i==low)
	 	 T->lchild=NULL;
	 else
	 	 SecondOptimal(T->lchild,R,sw,low,i-1);
	 if(i==high)
	 	 T->rchild=NULL;
	 else
	 	 SecondOptimal(T->rchild,R,sw,i+1,high);
	}
//算法9.4
typedef BiTree SOSTree;
status CreateSOSTree(SOSTree &T,SSTable ST){
	//由有序表ST构造一颗次优查找树T。ST的数据元素含有权域weight
	   if(ST.length==0)
	   	T=NULL;
	   else{
	   	 FindSW(sw,ST);
	   	 SecondOpiamal(T,ST.elem,sw,1,ST.length);
	   	}
	  return ok;
	}
//算法9.5a
BiTree SearchBST(BiTree T,KeyType){
	 //在根指针T所指二叉排序树中递归递归的查找某关键字等于key的数据元素
	 //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
	    if((!T)||EQ(key,T->data.key))
	    	return(T);      //查找结束
	    else if(LT(key,T->data.key)
	    	return (SearchBST(T->lchild,key));   //在左子树中继续查找
	    else 
	    	return (SearchBST(T->rchild,key));   //在右子树中继续查找
	}
//算法9.5b
status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p){
	//在根指针T所指二叉排序树中递归递归的查找某关键字等于key的数据元素
	 //若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则指针p指向查找路径上访问的最后一个结点并返回FALSE
	 //指针f指向T的的双亲,其初始调用值为NULL
	 if(!T) {p=f;return false;}
	else if EQ(key,T->data.key)  {p=T;ruturn true;}
	else if LT(key,T->data.key)  return SearchBST(T->lchild,key,T,p);
	else return SearchBST(T->rchild,key,T,p); 
	}
//算法9.6
status InsertBST(BiTree &T,ElemType e){
	//当二叉排序树T中不存在关键字等于e.key的数据元素时,插入e并返回TRUE
	//否则返回FALSE
	  if(!SearchBST(T,e.key.NULL,p){
	  	  s=(BiTree)malloc(sizeof(BiTNode));
	  	  s->data=e;
	  	  s->lchild=s->rchild=NULL;
	  	  if(!p)
	  	  	T=s; //被插入结点*s为新的根节点
	  	  else if LT(e.key,p->data.key)
	  	  	p->lchild=s;  //被插入结点*s为左孩子
	  	  else p->rchild=s;
	  	  return true;
	  	}
	  else
	  	return flase;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值