实验七 动态查找表
【实验类别】
综合性实验
【实验目的】
1、掌握查找的不同方法,并能用高级语言实现查找算法。
2、熟练掌握顺序表和有序表的查找方法。
3、熟练掌握二叉排序树的构造、查找、插入和删除方法
【实验学时】
2小时
【实验组人数】
1人。
【实验设备环境】
计算机。
【问题描述】
动态查找表的特点是表结构本身在查找过程中动态生成,即对给定的关键字key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录。设计一个有关动态查找表(以二叉排序树为例)的建立、查找、插入和删除等基本操作的演示程序。
参考:【测试数据】
1.根据运行提示,在建立时输入:
Please input data(-1:end)
45 24 53 45 12 24 90 –1
Input the key you want to search: 90
success,the value is 90
continue(y/n):y
Input the key you want to search:100
unsuccess
continue(y/n):n
2.读者可根据运行提示,自己输入数据建立一棵二叉排序树,然后进行多次查询。注意观察运行结果,读者可自己先在纸上画出这棵二叉排序树,注意分析和比较运行结果,以加强对二叉树排序的建立和查找过程的理解。
【说明】
1. 简单的算法分析:设二叉排序树的结点数目为n,在等概率情况下二叉排序树的查找成功的平均查找长度与二叉排序树的形状有关,最坏情况(二叉排序树成为一棵单枝树,即每个结点至多一个分支),ASL成功= = ;最好情况(二叉排序树与n个的结点的折半查找树形态相同)ASL成功= );
2. 数据元素类型定义时只写了关键字,若有其他数据项略,读者可根据实际情况加入,并在数据元素的输入和输出中加入其它数据项即可。
源代码
//SDTBU
//计科181
//L
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<malloc.h>
#include<algorithm>
using namespace std;
typedef int ElemType;
///二叉排序树的二叉链表储存结构
typedef struct BTNode
{
ElemType key;
struct BTNode *lchild, *rchild;
} BTNode, *BSTree;
///创建二叉排序树
BSTree InsertBST(BSTree T, BTNode *s)
{
if(T == NULL)
T = s;
else
{
if(s->key < T->key)
T->lchild = InsertBST(T->lchild, s);
else
{
if(s->key > T->key)
T->rchild = InsertBST(T->rchild, s);
}
}
return T;
}
BSTree CreateBST()
{
BSTree T, s;
int key;
T = NULL;
printf("输入关键字key,输入-1结束.\n");
while(1)
{
scanf("%d", &key);
if(key == -1)
{
printf("建立成功!\n");
break;
}
else
{
s = (BTNode*)malloc(sizeof(BTNode));
s->key = key;
s->lchild = NULL;
s->rchild = NULL;
T = InsertBST(T, s);
}
}
return T;
}
///查找
BTNode *SearchBST(BSTree T, int key)
{
if(T == NULL)
{
//printf("查找失败!\n");
return NULL;
}
else
{
if(key == T->key)
{
//printf("查找成功!\n");
return T;
}
else
{
if(key < T->key)
return (SearchBST(T->lchild, key));
else
return (SearchBST(T->rchild, key));
}
}
}
///插入
BSTree InsertBST_key(BSTree T, int key)
{
BTNode *s;
s = SearchBST(T, key);
if(s)
{
printf("关键字%d已存在!\n", s->key);
}
else
{
s = (BTNode*)malloc(sizeof(BTNode));
s->key = key;
s->lchild = NULL;
s->rchild = NULL;
T = InsertBST(T, s);
printf("插入成功!\n");
}
return T;
}
///删除
BTNode *SearchBST_F(BSTree T, int key, BSTree *F)
{
if(T == NULL)
return NULL;
if(key == T->key)
return T;
else
{
*F = T;
if(key < T->key)
return (SearchBST_F(T->lchild, key, F));
else
return (SearchBST_F(T->rchild, key, F));
}
}
BSTree deleteBST(BSTree T, BTNode *p, BTNode *f)
{
/* 删除p指针指向的结点,f指向p的双亲结点,T指向根结点的指针 */
BTNode *par, *s;
int kind;
if(!p->lchild && !p->rchild)
kind = 1; /*情况1,*p为叶子结点*/
else if (!p->rchild)
kind = 2; /*情况2,*p只有左子树*/
else if(!p->lchild)
kind = 3; /*情况2,*p只有右子树*/
else
kind = 4; /*情况3,*p左右子树均不空*/
switch(kind)
{
case 1:
if(!f)
T = NULL;
else
{
if(f->lchild == p)
f->lchild = NULL;
else
f->rchild = NULL;
free(p);
}
break;
case 2:
if(!f)
T = p->lchild;
else
{
if(p == f->lchild)
f->lchild = p->lchild;
else
f->rchild = p->lchild;
}
free(p);
break;
case 3:
if(!f)
T = p->rchild;
else
{
if(p == f->lchild)
f->lchild = p->rchild;
else
f->rchild = p->rchild;
}
free(p);
break;
case 4:
par = p;
s = p->lchild;
while(s->rchild != NULL)
{
par = s;
s = s->rchild;
}
p->key = s->key;
if(par == p)
par->lchild = s->lchild;
else
par->rchild = s->lchild;
free(s);
break;
}
return T;
}
BSTree SearchDeleteBST(BSTree T, int key)
{
BTNode *f, *p;
f = NULL;
p = SearchBST_F(T, key, &f);
if(p)
{
T = deleteBST(T, p, f);
printf("删除成功!\n");
}
else
{
printf("关键字为%d的记录不存在!\n",key);
}
//printf("删除成功!\n");
return T;
}
void menu()
{
printf("------------------------------------------\n");
printf("\t1.二叉排序树的建立\n");
printf("\t2.二叉排序树的查找\n");
printf("\t3.二叉排序树的插入\n");
printf("\t4.二叉排序树的删除\n");
printf("\t5.退出\n");
printf("-------------------------------------------\n");
}
int main()
{
BSTree T,T1;
int n,key;
menu();
while(1)
{
printf("请输入选项:\n");
scanf("%d",&n);
if(n==1)
{
T=CreateBST();
}
else if(n==2)
{
printf("输入查找的关键字:\n");
scanf("%d",&key);
T1=SearchBST(T,key);
if(T1==NULL)
printf("查找失败!\n");
else
printf("查找成功!\n");
}
else if(n==3)
{
printf("输入要插入的关键字:\n");
scanf("%d",&key);
T=InsertBST_key(T,key);
}
else if(n==4)
{
printf("输入要删除的关键字:\n");
scanf("%d",&key);
T=SearchDeleteBST(T,key);
}
else
break;
}
return 0;
}