目录
1 顺序查找
任务描述
本关任务:实现顺序查找。
相关知识
为了完成本关任务,你需要掌握:1.静态查找表的类型定义,2.顺序查找。
静态查找表的类型定义
#define MAXSIZE 100
typedef int KeyType; /*关键字类型*/
typedef struct
{
KeyType key;
/*InfoType otherinfo;*/
}RedType; /*记录类型*/
typedef struct
{
RedType r[MAXSIZE+1]; /*r[0]闲置或用作"监视哨"*/
int length;
}SSTable; /*静态查找表的类型定义*/
顺序查找
算法思想:从表的一端(第一个或最后一个)开始,逐个进行比较。 适用:顺序表、链表、有序表、无序表均可。
编程要求
在右侧编辑器中补充代码,完成Search_Seq
函数,以实现顺序查找。具体要求如下:
* Search_Seq:在表中查找其关键字等于key的记录,若找到返回该记录在表中位置,否则返回0。
测试说明
可在右侧文件夹中查看step1/Main.cpp
文件,以便于你的操作。
平台会对你编写的代码进行测试。
输入说明: 第一行输入若干记录的关键字,以-1标志结束。 第二行输入待查找的关键字。 输出说明: 第一行输出静态查找表L中各记录的关键字。 第二行输出查找的结果,如果找到,则输出该记录在表中的位置,否则输出not find!
测试输入: 37 21 75 55 64 19 -1
55 //待查找的关键字为55
预期输出: 37 21 75 55 64 19
4 //末尾换行
/*************************************************************
顺序查找 实现文件
更新于2020年6月23日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "search.h"
int Search_Seq(SSTable L, KeyType key)
{/*在静态查找表L中采用顺序查找法,查找其关键字等于key的记录,若找到返回该记录在表中位置,否则返回0*/
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int i=1;
while(i<=L.length&&L.r[i++].key!=key) ;
if(L.r[i-1].key==key) return i-1;
return 0;
/********** End **********/
}
void SSTableInput(SSTable &L) /*输入若干记录的关键字,存放到静态查找表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SSTableOutput(SSTable L) /*输出静态查找表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
2.折半查找
任务描述
本关任务:实现折半查找。
相关知识
为了完成本关任务,你需要掌握:1.静态查找表的类型定义,2.折半查找。
静态查找表的类型定义
#define MAXSIZE 100
typedef int KeyType; /*关键字类型*/
typedef struct
{
KeyType key;
/*InfoType otherinfo;*/
}RedType; /*记录类型*/
typedef struct
{
RedType r[MAXSIZE+1]; /*r[0]闲置或用作"监视哨"*/
int length;
}SSTable; /*静态查找表的类型定义*/
折半查找
算法思想:先确定待查元素所在范围;然后找中间元素;将中间元素与给定值 x 比较:若相等,则查找成功;若 x 小,则缩小至左半区;若 x 大,则缩小至右半区;直到相等或范围的下界﹥上界为止。 适用:有序的顺序表。
编程要求
在右侧编辑器中补充代码,完成Search_Bin
函数,以实现顺序查找。具体要求如下:
* Search_Bin:在递增或递减有序的表中查找其关键字等于key的记录,若找到返回该记录在表中位置,否则返回0。
测试说明
可在右侧文件夹中查看step2/Main.cpp
文件,以便于你的操作。
平台会对你编写的代码进行测试。
输入说明: 第一行按递增或递减的顺序输入若干记录的关键字,以-1标志结束。 第二行输入待查找的关键字。 输出说明: 第一行输出静态查找表L中各记录的关键字。 第二行输出查找的结果,如果找到,则输出该记录在表中的位置,否则输出not find!
测试输入: 19 21 37 55 64 75 -1
55 //待查找的关键字为55
预期输出: 19 21 37 55 64 75
4 //末尾换行
/*************************************************************
折半查找 实现文件
更新于2020年6月17日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "search.h"
int Search_Bin(SSTable L, KeyType key)/*在递增有序的顺序表L中折半查找其关键字等于key的记录*/
{
// 请在这里补充代码,完成本关任务
/********** Begin *********/
int l=1,r=L.length;
while(l<=r){
int mid=(l+r)/2;
if(L.r[mid].key==key) return mid;
else if(L.r[mid].key<key) l=mid+1;
else r=mid-1;
}
return 0;
/********** End **********/
}
void SSTableInput(SSTable &L) /*输入若干记录的关键字,存放到静态查找表L中*/
{
int i=1; KeyType x;
scanf("%d",&x);
while(x!=-1)
{
L.r[i++].key=x; scanf("%d",&x);
}
L.length=i-1;
}
void SSTableOutput(SSTable L) /*输出静态查找表L中各记录的关键字*/
{
int i;
for(i=1;i<=L.length;i++)
printf("%d ",L.r[i].key);
printf("\n");
}
3.二叉排序树的查找
任务描述
本关任务:实现二叉排序树的查找。
相关知识
为了完成本关任务,你需要掌握:1.二叉排序树的定义,2.二叉排序树的查找,3.动态查找表的二叉链表存储表示。
二叉排序树的定义
二叉排序树或者是空树,或者是满足如下性质的二叉树: ● 如果其左子树非空,则左子树上所有结点的值均小于根结点的值; ● 如果其右子树非空,则右子树上所有结点的值均大于根结点的值; ● 左子树和右子树本身又各是一棵二叉排序树。
二叉排序树的查找
在二叉排序树T中查找其关键字等于key的记录结点: ● 若 key 等于根记录结点的关键字,则表示找到,查找成功; ● 若 key 小于根记录结点的关键字,则在左子树上继续查找; ● 若 key 大于根记录结点的关键字,则在右子树上继续查找; ● 若沿着某条路径碰到一个叶子结点还未找到,则查找失败。
动态查找表的二叉链表存储表示
#define MAXSIZE 100
typedef int KeyType; /*关键字类型*/
typedef struct
{
KeyType key;
/*InfoType otherinfo;*/
}RedType; /*记录类型*/
typedef struct BiTNode
{
RedType data;
struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree; /*动态查找表的二叉链表存储表示*/
编程要求
在右侧编辑器中补充代码,完成Search_BST
函数,以实现二叉排序树的查找。具体要求如下:
* Search_BST:在二叉排序树上查找其关键字等于key的记录结点。若找到返回该结点指针,parent指向其双亲;否则返回空指针,parent指向访问路径上最后一个结点。
测试说明
可在右侧文件夹中查看step3/Main.cpp
文件,以便于你的操作。
平台会对你编写的代码进行测试。
输入说明: 第一行输入若干记录的关键字,以-1标志结束。 第二行输入待查找的关键字。 输出说明: 第一行输出二叉排序树先序遍历的结果。 第二行输出二叉排序树中序遍历的结果。 第三行输出查找的结果,如果找到,则输出该结点的双亲结点的关键字,否则输出not find!
测试输入: 19 14 66 21 83 27 55 13 10 50 -1
55 //待查找的关键字为55
预期输出: PreOrder:19 14 13 10 66 21 27 55 50 83 //先序遍历的结果
InOrder:10 13 14 19 21 27 50 55 66 83 //中序遍历的结果
27 //末尾换行
开始你的任务吧,祝你成功!
/*************************************************************
二叉排序树的查找 实现文件
更新于2020年7月5日
**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "search.h"
BiTree Search_BST(BiTree T, KeyType key, BiTNode **parent)
{/*在二叉排序树T上查找其关键字等于key的记录结点。若找到返回该结点指针,parent指向其双亲;否则返回空指针,parent指向访问路径上最后一个结点。*/
// 请在这里补充代码,完成本关任务
/********** Begin *********/
if(T==NULL) return NULL;
if(key==T->data.key) return T;
*parent = T;
if(key<T->data.key) return Search_BST(T->lchild, key,parent);
if(key>T->data.key) return Search_BST(T->rchild, key,parent);
/********** End **********/
}
void Insert_BST(BiTree *T, RedType r)/*若二叉排序树T中没有关键字为r.key的记录,则插入*/
{
BiTNode *p,*q,*parent;
parent=NULL;
p=Search_BST(*T,r.key,&parent); /*查找*/
if(p) printf("BST中有结点r,无需插入\n");
else
{
p=parent;
q=(BiTNode *)malloc(sizeof(BiTNode)); q->data=r; q->lchild=q->rchild=NULL;
if(*T==NULL) *T=q; /*若T为空,则q为新的根*/
else if(r.key<p->data.key) p->lchild=q;
else p->rchild=q;
}
}
BiTree Create_BST( ) /*二叉排序树的构造*/
{/*输入若干记录的关键字(以-1标志结束),生成一棵BST,采用二叉链表存储,返回其根指针T*/
BiTree T; RedType r;
T=NULL; /*建空树*/
scanf("%d",&r.key);
while(r.key!=-1)
{
Insert_BST(&T, r);
scanf("%d",&r.key);
}
return T;
}
void PreOrder(BiTree bt) /*先序遍历*/
{
if(bt)
{
printf("%d ",bt->data.key);
PreOrder(bt->lchild);
PreOrder(bt->rchild);
}
}
void InOrder(BiTree bt) /*中序遍历*/
{
if(bt)
{
InOrder(bt->lchild);
printf("%d ",bt->data.key);
InOrder(bt->rchild);
}
}