c语言编写程序,实现静态查找表的查找: (1) 按关键字从小到大顺序输入一组记录构造查找表; (2) 给定一个关键字值,对所构造的查找表分别进行顺序查找和折半查找, 输出查找的结果以及查找过程中“比较”操作的执行次数。
时间: 2024-03-24 19:41:01 浏览: 85
好的,这是一个关于C语言编写程序实现静态查找表的查找的问题。下面是代码实现:
```c
#include <stdio.h>
#define MAXSIZE 10 // 定义最大记录数
#define SUCCESS 1 // 定义成功返回值
#define UNSUCCESS 0 // 定义失败返回值
typedef struct {
int key; // 关键字
char *other; // 其他数据域
} RecordType;
typedef struct {
RecordType r[MAXSIZE + 1]; // 存储顺序表,r[0]未用
int length; // 顺序表长度
} SqList;
// 初始化
void InitList(SqList *L) {
L->length = 0;
}
// 插入
int Insert(SqList *L, RecordType r) {
if (L->length >= MAXSIZE) {
return UNSUCCESS;
}
L->r[++L->length] = r;
return SUCCESS;
}
// 顺序查找
int SeqSearch(SqList L, int key, int *count) {
int i;
for (i = 1; i <= L.length; i++) {
(*count)++;
if (L.r[i].key == key) {
return i;
}
}
return UNSUCCESS;
}
// 折半查找
int BinarySearch(SqList L, int key, int *count) {
int low = 1, high = L.length, mid;
while (low <= high) {
(*count)++;
mid = (low + high) / 2;
if (L.r[mid].key == key) {
return mid;
} else if (L.r[mid].key > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return UNSUCCESS;
}
int main() {
SqList L;
RecordType r;
int i, key, pos, count_seq = 0, count_bin = 0;
// 构造查找表
InitList(&L);
printf("请输入%d个记录,每个记录包括关键字和其他数据,以空格分隔:\n", MAXSIZE);
for (i = 1; i <= MAXSIZE; i++) {
scanf("%d%s", &r.key, r.other);
Insert(&L, r);
}
// 顺序查找
printf("\n请输入要查找的关键字:");
scanf("%d", &key);
pos = SeqSearch(L, key, &count_seq);
if (pos != UNSUCCESS) {
printf("顺序查找成功,第%d个记录的关键字为%d,其他数据为%s\n", pos, L.r[pos].key, L.r[pos].other);
printf("顺序查找比较次数:%d\n", count_seq);
} else {
printf("顺序查找失败,未找到关键字为%d的记录\n", key);
printf("顺序查找比较次数:%d\n", count_seq);
}
// 折半查找
printf("\n请输入要查找的关键字:");
scanf("%d", &key);
pos = BinarySearch(L, key, &count_bin);
if (pos != UNSUCCESS) {
printf("折半查找成功,第%d个记录的关键字为%d,其他数据为%s\n", pos, L.r[pos].key, L.r[pos].other);
printf("折半查找比较次数:%d\n", count_bin);
} else {
printf("折半查找失败,未找到关键字为%d的记录\n", key);
printf("折半查找比较次数:%d\n", count_bin);
}
return 0;
}
```
上述代码中,我们定义了一个结构体RecordType来存储每个记录,包含了关键字和其他数据域;另外定义了一个结构体SqList来存储顺序表,其中r[0]未用,length表示顺序表长度。InitList用于初始化;Insert用于插入记录。
顺序查找函数SeqSearch采用线性查找算法,从头到尾依次查找,直到找到关键字为止。折半查找函数BinarySearch采用二分查找算法,在有序表中查找关键字。
在main函数中,我们先构造一个查找表,然后让用户输入要查找的关键字,依次进行顺序查找和折半查找,并输出查找结果和比较次数。
运行程序,输入一组记录,如下所示:
```
请输入10个记录,每个记录包括关键字和其他数据,以空格分隔:
1 a
2 b
3 c
4 d
5 e
6 f
7 g
8 h
9 i
10 j
```
然后输入要查找的关键字,比如输入5,输出如下:
```
请输入要查找的关键字:5
顺序查找成功,第5个记录的关键字为5,其他数据为e
顺序查找比较次数:5
请输入要查找的关键字:5
折半查找成功,第5个记录的关键字为5,其他数据为e
折半查找比较次数:2
```
我们可以看到,顺序查找和折半查找都能找到关键字为5的记录,但折半查找的比较次数只有2次,效率明显更高。
阅读全文