实验七_查找算法

引言

  1. 建议第一次写这些题目的同学可以自己先敲一下代码,然后再参考文章中的代码。
  2. 码字不易,如果这篇文章对您有帮助的话,希望您能点赞、收藏、加关注!您的鼓励就是我前进的动力!

第一题

题目

题目描述
利用静态查找表完成顺序查找折半查找,注意折半查找的前提是查找表中的元素是有序的。

输入
输入包括多行,每行代表一定的含义:
输入1,创建静态查找表,接着输入n表示查表中元素个数,再输入n个整数,创建成功后输出查找表中所有元素;
输入2 k1,代表使用顺序查找,k1表示需要查找的值,找到输出元素在查找表中的位置,否则输出0;
输入3 k2,代表使用折半查找,k2表示需要查找的值,找到输出元素在查找表中的位置,否则输出0,注意在使用折半查找前主函数已对查找表进行的升序排序,已该表元素的位置;
输入0,程序结束。

输出
按照输入的顺序依次输出相关信息。

样例输入
1
5 1 5 2 8 6
2 3
2 5
3 6
3 9

样例输出
1 5 2 8 6
0
2
4
0

解析与注意事项

  1. 注意折半查找判断时,若key 小于 mid,则「high = mid - 1;」若key 大于 mid,则「 low = mid + 1;」。

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//注意后面使用的sort函数是C++ STL中的内容,本题必须使用C++作为提交语言
#include <algorithm>
using namespace std;

//顺序存储结构
typedef struct {
	int* elem;	//指向数据元素基址,0号不存元素
	int length;
}SSTable;		//静态顺序表

//输出顺序静态表
void PrintSST(SSTable& ST) {
	int i;
	for (i = 1; i <= ST.length; i++) {
		printf("%d ", ST.elem[i]);
	}
	printf("\n");
}

//创建顺序静态表
void CreateSST(SSTable& ST, int n) {
	int i;
	ST.elem = (int*)malloc(sizeof(int) * (n + 1));
	ST.length = n;
	for (i = 1; i <= n; i++) {
		scanf("%d", &ST.elem[i]);
		getchar();
	}
}

//顺序查找
int Search_Seq(SSTable& ST, int key) {
	//--------补充代码--Start------	
	int i;
	for (i = 1; i < ST.length; i++)
	{
		if (ST.elem[i] == key)
			return i;
	}
	return 0;
	//--------补充代码--End-------
}

//折半查找算法
int Search_Bin(SSTable& ST, int key) {
	//--------补充代码--Start------	
	int low, high, mid;
	low = 1;
	high = ST.length;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (key < ST.elem[mid])
			high = mid - 1;
		else if (key > ST.elem[mid])
			low = mid + 1;
		else
			return mid;
	}
	return 0;
	//--------补充代码--End-------
}
//主函数
int main() {
	int n, key, select;
	SSTable SST;

	while (scanf("%d", &select) != EOF) {
		if (select == 0)
			return 0;
		else if (select == 1) {
			scanf("%d", &n);
			CreateSST(SST, n);
			PrintSST(SST);
		}
		else if (select == 2) {
			scanf("%d", &key);
			printf("%d\n", Search_Seq(SST, key));
		}
		else if (select == 3) {
			scanf("%d", &key);
			//对查找表进行升序排序
			sort(SST.elem + 1, SST.elem + SST.length + 1);
			printf("%d\n", Search_Bin(SST, key));
		}
	}
	return 0;
}


第二题

题目

题目描述
利用二叉排序树完成查找。

输入
输入包括多行,每行代表一定的含义:
输入1,创建二叉排序树,接着输入n表示查表中元素个数,再输入n个整数,插入到二叉排序树中;
输入2,代表中序输出二叉排序树,每个输出后包括一个空格;
输入3 key,代表在二叉排序树中查找key,若找到则则输出1,否则输出0;
输入0,程序结束。

输出
按照输入的顺序依次输出相关信息。

样例输入
1
4 10 5 20 15
2
3 5
3 25
0

样例输出
5 10 15 20
1
0

解析与注意事项

(NULL)

代码

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>

//二叉排序树结构
typedef struct Node {
	int data;
	struct Node* lchild, * rchild;
}BitNode, * BiTree;

//中序遍历
void InOrderTraverse(BiTree T) {
	if (T != NULL) {
		InOrderTraverse(T->lchild);
		printf("%d ", T->data);
		InOrderTraverse(T->rchild);
	}
}

/*递归查找二叉排序树T中是否存在key,指针f指向t的双亲,其初始调用值为NULL*/
/*若查找成功,则指针p指向该数据的元素结点,并返回TRUE*/
/*否则,指针p指向查找路径上访问的最后一个结点并返回FALSE*/
int SearchBST(BiTree& T, int key, BiTree f, BiTree& p) {
	//--------补充代码--Start------	
	if (!T)
	{
		p = f;//p指向查找路径上访问的最后一个结点
		return 0;
	}
	else if (key == T->data)
	{
		p = T;
		return 1;
	}
	else if (key < T->data)
		return SearchBST(T->lchild, key, T, p);
	else
		return SearchBST(T->rchild, key, T, p);
	//--------补充代码--End-------
}

//当二叉排序树t中不存在关键字等于key的数据元素时,插入key
void InsertBST(BiTree& T, int key) {
	//--------补充代码--Start------	
	BiTree p, s;
	if (!SearchBST(T, key, NULL, p))
	{
		s = (BiTree)malloc(sizeof(BitNode));
		s->data = key;
		s->lchild = s->rchild = NULL;
		if (!p)
			T = s;
		else if (key < p->data)
			p->lchild = s;
		else
			p->rchild = s;
	}
	//--------补充代码--End-------
}

//主函数
int main() 
{
	int i, n, key, select;
	BiTree p, T = NULL;

	while (scanf("%d", &select) != EOF) {
		if (select == 0)
			return 0;
		else if (select == 1) {
			scanf("%d", &n);
			for (i = 1; i <= n; i++)
			{
				scanf("%d", &key);
				getchar();
				InsertBST(T, key);
			}
		}
		else if (select == 2) {
			if (T)
			{
				InOrderTraverse(T);
				printf("\n");
			}
		}
		else if (select == 3) {
			scanf("%d", &key);
			if (!SearchBST(T, key, NULL, p))
				printf("0\n");
			else
				printf("1\n");
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沉远

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

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

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

打赏作者

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

抵扣说明:

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

余额充值