【头歌】——数据结构-查找的实现及其应用

前言

为了方便部分同学先答案再题目,可以直接复制,可根据目录跳转
1 顺序查找
2 折半查找
3 二叉排序树的查找

正文

第1关 顺序查找

#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 = L.length;

	L.r[0].key = key;//监视
	while (L.r[i].key != key)
		i--;

	return i;

	/********** 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");
}


任务描述
本关任务:实现顺序查找。

相关知识
为了完成本关任务,你需要掌握: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 //末尾换行

开始你的任务吧,祝你成功!

第2关.折半查找

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "search.h"	

int Search_Bin(SSTable L, KeyType key)/*在递增有序的顺序表L中折半查找其关键字等于key的记录*/
{
	// 请在这里补充代码,完成本关任务
	/********** Begin *********/
    int low = 1, high = L.length;  
    while (low <= high)
    {
        int mid = (low + high) / 2;
        if (L.r[mid].key == key)
        {
            return mid;
        }
        if (L.r[mid].key > key)
        {
            high = mid - 1;  
        }
        else
        {
            low = 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");
}


任务描述
本关任务:实现折半查找。

相关知识
为了完成本关任务,你需要掌握: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 //末尾换行

开始你的任务吧,祝你成功!

第3关.二叉排序树

递归写法
#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 || T->data.key == key)
	{
		return T;
	}
	*parent = T;
	if (key < T->data.key)
	{
		return Search_BST(T->lchild, key, parent);
	}
	else
	{
		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);
	}
}


非递归
#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 *********/
	BiTree p = T;
	*parent = NULL;

	while (p != NULL && p->data.key != key)
	{
		*parent = p;
		if (key < p->data.key)
		{
			p = p->lchild;
		}
		else
		{
			p = p->rchild;
		}
	}
	return p;
	/********** 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);
	}
}

任务描述
本关任务:实现二叉排序树的查找。

相关知识
为了完成本关任务,你需要掌握: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 //末尾换行

开始你的任务吧,祝你成功!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值