编程实现如下功能: (1)根据输入的查找表的表长n和n个关键字值,建立顺序查找表,并在此查找表中用顺序查找方法查找给定关键值的记录,最后输出查找结果。 (2)根据输入的查找表的表长n和n个按升排列的关键字值,建立有序顺序查找表,并在此查找表中用二分查找方法查找给定关键值的记录,最后输出查找结果。 (3)主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行哪一种查找操作。用c语言写完整代码
时间: 2024-04-05 14:34:28 浏览: 97
以下是实现上述功能的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 // 最大容量
typedef struct {
int key;
// 其他数据项
} ElemType;
typedef struct {
ElemType *elem; // 存储空间基址
int length; // 当前长度
} SSTable;
/**
* 顺序查找
* @param st 查找表
* @param key 查找关键字
* @return 关键字在表中的位置,未找到返回0
*/
int Search_Seq(SSTable st, int key) {
int i;
st.elem[0].key = key; // 哨兵
for (i = st.length; st.elem[i].key != key; i--);
return i;
}
/**
* 二分查找
* @param st 查找表
* @param key 查找关键字
* @return 关键字在表中的位置,未找到返回0
*/
int Search_Bin(SSTable st, int key) {
int low = 1, high = st.length, mid;
while (low <= high) {
mid = (low + high) / 2;
if (st.elem[mid].key == key) {
return mid;
} else if (st.elem[mid].key > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return 0;
}
/**
* 建立顺序查找表
* @param st 查找表
* @param n 表长
*/
void Create_Seq(SSTable *st, int n) {
int i;
st->elem = (ElemType *) malloc((n + 1) * sizeof(ElemType)); // 0号单元存储哨兵
st->length = n;
printf("请输入%d个关键字值:\n", n);
for (i = 1; i <= n; i++) {
scanf("%d", &st->elem[i].key);
// 输入其他数据项
}
}
/**
* 建立有序顺序查找表
* @param st 查找表
* @param n 表长
*/
void Create_Ord(SSTable *st, int n) {
int i;
st->elem = (ElemType *) malloc((n + 1) * sizeof(ElemType)); // 0号单元存储哨兵
st->length = n;
printf("请输入%d个按升序排列的关键字值:\n", n);
for (i = 1; i <= n; i++) {
scanf("%d", &st->elem[i].key);
// 输入其他数据项
}
}
/**
* 输出查找结果
* @param pos 关键字在表中的位置
*/
void Print(int pos) {
if (pos) {
printf("查找成功,关键字在表中的位置是:%d\n", pos);
} else {
printf("查找失败,关键字不在表中。\n");
}
}
int main() {
SSTable st;
int choice, key, pos;
printf("请输入查找表的表长:\n");
scanf("%d", &st.length);
while (st.length > MAXSIZE) {
printf("表长太大,请重新输入表长:\n");
scanf("%d", &st.length);
}
while (1) {
printf("\n-------------------------\n");
printf("请选择查找操作类型:\n");
printf("1. 顺序查找\n");
printf("2. 二分查找\n");
printf("3. 退出程序\n");
printf("-------------------------\n");
scanf("%d", &choice);
switch (choice) {
case 1:
Create_Seq(&st, st.length);
printf("请输入要查找的关键字值:\n");
scanf("%d", &key);
pos = Search_Seq(st, key);
Print(pos);
free(st.elem);
break;
case 2:
Create_Ord(&st, st.length);
printf("请输入要查找的关键字值:\n");
scanf("%d", &key);
pos = Search_Bin(st, key);
Print(pos);
free(st.elem);
break;
case 3:
exit(0);
default:
printf("输入有误,请重新选择!\n");
break;
}
}
return 0;
}
```
注意:本代码并未对输入进行严格的错误处理,仅供参考。
阅读全文