7.1 基于线性表的查找
7.1.1 顺序查找法
#define LIST_SIZE 20
typedef int KeyType;
typedef int OtherType;
typedef struct {
KeyType key;//关键字
OtherType other_data;
}RecordType;
typedef struct {
RecordType r[LIST_SIZE+1];
int length;
}RecordList;
int SeqSearch(RecordList l,KeyType k)//在顺序表中顺序查找其关键字等于k的元素
{
int i;
l.r[0].key=k;
i=l.length;
while(k!=l.r[i].key) i--;
return i;
}
7.1.2 折半查找法
int BinSrch(RecordList l,KeyType k)//折半查找法
{
int low=1,high=l.length;
int mid;
while(low<=high)
{
mid=(low+high)/2;
if(l.r[mid].key==k) return mid;
else if(l.r[mid].key>k) high=mid-1;
else low=mid+1;
}
return 0;
}
7.1.3 分块查找法
7.2 基于树的查找
7.2.1 二叉排序树
typedef int KeyType;
typedef struct node
{
KeyType key;//关键字
struct node * lchild,*rchild;//左右指针
}BSTNode,*BSTree;
void InsertBST(BSTree *bst,KeyType key)//二叉排序树插入的递归算法
{
BSTree s;
if(*bst==NULL)
{
s=(BSTree)malloc(sizeof(BSTNode));
s->key=key;
s->lchild=s->rchild=NULL;
*bst=s;
}
else if(key>(*bst)->key) InsertBST(&((*bst)->rchild),key);
else if(key<(*bst)->key) InsertBST(&((*bst)->lchild),key);//!!
}
void CreateBST(BSTree *bst)//创建二叉排序树
{
KeyType key;
*bst=NULL;//!!
printf("请输入你想创建的值");
scanf("%d",&key);
while(key!=0)
{
InsertBST(bst,key);
scanf("%d",&key);
}
}
BSTree SearchBST1(BSTree bst,KeyType key)//二叉排序树的查找 (递归)
{
if(!bst) return NULL;//!!
else if(bst->key==key)
return bst;
else if(bst->key>key)
return SearchBST1(bst->lchild,key);
else
return SearchBST1(bst->rchild,key);
}
BSTree SearchBST2(BSTree bst,KeyType key)//二叉排序树的查找 (非递归)
{
BSTree q;
q=bst;
while(q)
{
if(q->key==key) return q;
else if(q->key>key) q=q->lchild;
else q=q->rchild;
}
return NULL;
}
BSTNode *DelBST(BSTree bst,KeyType key)//在二叉排序树中删除结点,返回删除后的二叉树
{
BSTNode *q,*s,*p,*f;
p=bst,f=NULL;
while(p)//查找结点位置
{
if(p->key==key) break;
f=p;
if(p->key>key)
p=p->lchild;
else
p=p->rchild;
}
if(!p) return bst;
if(p->lchild==NULL)//p无左子树的情况,右子树情况不影响
{
if(f==NULL) bst=p->rchild;//!!
else if(f->lchild==p) f->lchild=p->rchild;
else f->rchild=p->lchild;
free(p);
}
else//p是否为头结点不影响
{
q=p,s=p->lchild;
while(s->rchild)//在p的左子树中查找最右下结点
{
q=s;
s=s->rchild;
}
if(q==p) p->lchild=s->lchild;
else q->rchild=s->lchild;
p->key=s->key;
free(s);
}
return bst;
}
void InOrder(BSTree bst)//中序遍历
{
if (bst!=NULL)//!!
{
InOrder(bst->lchild);
printf("%d ",bst->key);
InOrder(bst->rchild);
}
}
7.2.2 平衡二叉排序树
typedef int KeyType;
typedef struct node
{
int bf;//平衡因子
KeyType key;//关键字
struct node * lchild,*rchild;//左右指针
}AVLTNode,*AVLTree;
void ins_AVLtree(AVLTree *avlt,KeyType k)//在平衡二叉树中插入元素k,使之成为一颗新的平衡二叉树
{
AVLTree s,p,A,B,C,FA,fp;
s=(AVLTree)malloc(sizeof(AVLTNode));
s->key=k,s->lchild=NULL,s->rchild=NULL;
s->bf=0;
if(*avlt==NULL)
{
*avlt=s;
return;
}
else{
/*首先查找s的插入位置fp,同时记录离插入位置最近且平衡因子不等于0的结点A,A可能成为失衡结点*/
A=*avlt,FA=NULL;
p=*avlt,fp=NULL;
while(p!=NULL)
{
if(p->bf!=0) {A=p,FA=fp;}
fp=p;
if(k<p->key) p=p->lchild;
else p=p->rchild;
}
/*插入结点s*/
if(k<fp->key) fp->lchild=s;
else fp->rchild=s;
}
/*确定结点B,并修改A的平衡因子*/
if(k<A->key)
{
B=A->lchild;
A->bf=A->bf+1;
}
else{
B=A->rchild;
A->bf=A->bf-1;
}
/*修改B到S路径上各结点的平衡因子*/
p=B;
while(p!=s)
if(k<p->key)
{
p->bf=1;
p=p->lchild;
}
else
{
p->bf=-1;
p=p->rchild;
}
/*判断失衡结点并做相应处理*/
if(A->bf==2 &&B->bf==1)//LL型
{
A->lchild=B->rchild;
B->rchild=A;
A->bf=B->bf=0;
/*将调整后二叉树的根节点B接到A处 */
if(FA==NULL) *avlt=B;//当A为根结点时
else if(FA->lchild==A) FA->lchild=B;
else FA->rchild=B;
}
else if(A->bf==2 &&B->bf==-1)//LR型
{
C=B->rchild;
B->rchild=C->lchild;
A->lchild=C->rchild;
C->lchild=B,C->rchild=A;
if(s->key<C->key)
{
A->bf=-1,B->bf=0,C->bf=0;
}
else if(s->key>C->key)
{
A->bf=0,B->bf=1,C->bf=0;
}
else
{
A->bf=0,B->bf=0;
}
if(FA==NULL) *avlt=C;
else if(FA->lchild==A) FA->lchild=C;
else FA->rchild=C;
}
else if(A->bf==-2 &&B->bf==1)//RL型
{
C=B->lchild;
B->lchild=C->rchild;
A->rchild=C->lchild;
C->lchild=A,C->rchild=B;
if(s->key<C->key)
{
A->bf=0,B->bf=-1,C->bf=0;
}
else if(s->key>C->key)
{
A->bf=1,B->bf=0,C->bf=0;
}
else
{
A->bf=0,B->bf=0;
}
if(FA==NULL) *avlt=C;
else if(FA->lchild==A) FA->lchild=C;
else FA->rchild=C;
}
else if(A->bf==-2 &&B->bf==-1)//RR型
{
A->rchild=B->lchild;
B->lchild=A;
A->bf=B->bf=0;
if(FA==NULL) *avlt=B;
else if(FA->lchild==A) FA->lchild=B;
else FA->rchild=B;
}
}
7.2.3 B树
在这里插入代码片
7.3 计算式查找法——哈希法
在这里插入代码片
7.4 综合