引言
- 建议第一次写这些题目的同学可以自己先敲一下代码,然后再参考文章中的代码。
- 码字不易,如果这篇文章对您有帮助的话,希望您能点赞、收藏、加关注!您的鼓励就是我前进的动力!
第一题
题目
题目描述
利用静态查找表完成顺序查找和折半查找,注意折半查找的前提是查找表中的元素是有序的。
输入
输入包括多行,每行代表一定的含义:
输入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
解析与注意事项
- 注意折半查找判断时,若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;
}