实验:查找

基本内容:
算法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; 
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cai-4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值