基本内容:
算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和改进的顺序查找,并对其查找效率进行比较;
算法2:采用顺序存储结构创建静态查找表——有序表,对有序表进行二分查找;
编程实现按二叉排序树算法进行查找。
实验原理
(1)有序表的折半查找过程是:先确定待查记录所在的范围(区间),然后逐步缩小范围直到找到或找不到该记录为止;
(2)二叉排序树查找过程是:首先将给定值和根结点的关键字比较,若相等,则查找成功,否则将依据给定值和根结点的关键字之间的大小关系,分别在左子树或右子树上继续进行查找;
实验源代码:
#include <stdio.h>
#include <stdlib.h>
typedef int KeyType;
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
typedef struct{
KeyType key;
}ElemType;
typedef struct{
ElemType *elem;
int length;
}SSTable;
int Create(SSTable *ST)
{//创建静态表
int i,n;
printf("请输入你要创建的表的长度:\n");
scanf("%d",&n);
ST->elem =(ElemType *)malloc((n+1)*sizeof(ElemType));
if(!ST->elem )
return 0;
printf("请输入%d个数据(若采用二分法查找关键字,则顺序输入)。\n",n);
for(i=1;i<=n;i++)
{
scanf("%d",&ST->elem [i].key);
}
ST->length =n;
return 1;
}
int Search_Seq(SSTable ST,KeyType key)
{
int i=1;
while(i<=ST.length &&!EQ(ST.elem [i].key,key))
++i;
if(i<=ST.length )
return i;
else
return 0;
}
int Search_SSeq(SSTable ST,KeyType key)
{
int i;
ST.elem [0].key=key;
for(i=ST.length ;!EQ(ST.elem [i].key,key);--i);
return i;
}
int Search_Bin(SSTable ST,KeyType key)
{
int low=1;
int high=ST.length ;
while(low<=high){
int mid=(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;
}
}
int main()
{
int i,time;
SSTable ST;
KeyType key;
printf("请输入创建表的类型(0.无序表,1.有序表):\n");
scanf("%d",&time);
Create(&ST);
printf("创建成功!\n");
printf("请输入需查找的关键字:\n");
scanf("%d",&key);
if(time==0)
{
printf("顺序查找关键字结果为:\n");
i=Search_Seq(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
printf("改进算法顺序查找关键字结果为:\n");
i=Search_SSeq(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
}
else
{
printf("二分查找关键字结果为:\n");
i=Search_Bin(ST,key);
if(i==0)
{
printf("查找失败,表中无此元素\n");
}
else
{
printf("查找成功!\n");
printf("位置是%d\n",i);
}
}
}
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
void BSTInsert(BiTree *t,int element)
{
if(NULL==*t) {
(*t)=(BiTree)malloc(sizeof(BiTNode));
(*t)->data=element;
(*t)->lchild=(*t)->rchild=NULL;
}
if(element==(*t)->data)
return;
else if(element<(*t)->data)
BSTInsert(&(*t)->lchild,element);
else
BSTInsert(&(*t)->rchild,element);
}
void CreateBST( BiTree *t,int *a,int n)
{
(*t)=NULL;
for(int i=0;i<n;i++)
BSTInsert(t,a[i]);
}
void SearchBST(BiTree t,int key )
{
BiTree p;
p=t;
if(p){
if(key==p->data)
printf("查找成功!\n");
else if((key<p->data)&&(NULL!=p->lchild))
SearchBST(p->lchild,key);
else if((key>p->data)&&(NULL!=p->rchild))
SearchBST(p->rchild,key);
else
printf("无此元素!\n");
}
}
void PrintBST( BiTree t )
{
if(t) {
PrintBST(t->lchild);
printf("%d",t->data);
PrintBST(t->rchild);
}
}
int main()
{
int n;
int *a;
int key;
BiTree t;
printf("请输入二叉查找树的结点数:\n");
scanf("%d",&n);
a=(int *)malloc(sizeof(int)*n);
printf("请输入二叉找树的结点数据:\n");
for(int i=0;i<n; i++ )
scanf("%d",&a[i]);
CreateBST(&t,a,n);
printf("请输入要查找的元素:\n");
scanf("%d",&key);
printf("查找结果:\n");
SearchBST(t,key);
printf("\n");
printf("\n");
return 0;
}