先依次输入元素为简单类型(int、char)的数个数据元素建立顺序存储的线性表,然后以该线性表为查找表进行顺序查找;再用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。用C语言实现
时间: 2024-03-15 18:44:15 浏览: 57
好的,我来为您解答这个问题。
首先,我们需要定义线性表的结构体和一些基本操作函数。
```
#define MAXSIZE 100 // 定义线性表的最大长度
typedef struct {
int key; // 关键字
char data; // 数据元素
} ElemType;
typedef struct {
ElemType elem[MAXSIZE]; // 存储空间
int length; // 当前长度
} SqList;
void InitList(SqList *L) {
L->length = 0;
}
int ListInsert(SqList *L, int i, ElemType e) {
if (L->length == MAXSIZE) { // 线性表已满
return 0;
}
if (i < 1 || i > L->length + 1) { // 插入位置不合法
return 0;
}
for (int j = L->length; j >= i; j--) { // 插入位置及之后的元素后移
L->elem[j+1] = L->elem[j];
}
L->elem[i] = e; // 插入新元素
L->length++; // 长度加1
return 1;
}
int ListSearch(SqList L, int key) {
for (int i = 1; i <= L.length; i++) { // 从前往后顺序查找
if (L.elem[i].key == key) {
return i; // 找到了,返回位置
}
}
return 0; // 没找到,返回0
}
void BubbleSort(SqList *L) {
for (int i = 1; i < L->length; i++) { // 外层循环控制比较轮数
for (int j = 1; j <= L->length-i; j++) { // 内层循环控制每轮比较次数
if (L->elem[j].key > L->elem[j+1].key) { // 如果前面的关键字大于后面的关键字
ElemType temp = L->elem[j];
L->elem[j] = L->elem[j+1];
L->elem[j+1] = temp; // 交换两个元素
}
}
}
}
int BinarySearch(SqList L, int key) {
int low = 1, high = L.length;
while (low <= high) { // 当 low 大于 high 时,查找区间为空
int mid = (low + high) / 2; // 计算中间位置
if (L.elem[mid].key == key) {
return mid; // 找到了,返回位置
} else if (L.elem[mid].key < key) {
low = mid + 1; // 在右半边查找
} else {
high = mid - 1; // 在左半边查找
}
}
return 0; // 没找到,返回0
}
```
然后,我们就可以依次输入元素为简单类型(int、char)的数个数据元素建立顺序存储的线性表了。
```
int main() {
SqList L;
InitList(&L); // 初始化线性表
int n;
printf("请输入元素个数:");
scanf("%d", &n);
printf("请输入每个元素的关键字和数据元素:\n");
for (int i = 1; i <= n; i++) {
ElemType e;
scanf("%d %c", &e.key, &e.data);
ListInsert(&L, i, e); // 插入新元素
}
printf("线性表为:\n");
for (int i = 1; i <= L.length; i++) {
printf("(%d,%c) ", L.elem[i].key, L.elem[i].data); // 遍历输出线性表
}
printf("\n");
return 0;
}
```
接下来,我们使用顺序查找对该线性表进行查找。
```
int main() {
// ...
int key;
printf("请输入要查找的关键字:");
scanf("%d", &key);
int pos = ListSearch(L, key);
if (pos == 0) {
printf("未找到该元素!\n");
} else {
printf("该元素的位置为:%d\n", pos);
}
// ...
}
```
最后,我们用冒泡排序对该线性表按某个关键字值进行排序,并且在排序之后的线性表之上进行折半查找。
```
int main() {
// ...
BubbleSort(&L); // 冒泡排序
printf("排序后的线性表为:\n");
for (int i = 1; i <= L.length; i++) {
printf("(%d,%c) ", L.elem[i].key, L.elem[i].data); // 遍历输出线性表
}
printf("\n");
printf("请输入要查找的关键字:");
scanf("%d", &key);
pos = BinarySearch(L, key); // 折半查找
if (pos == 0) {
printf("未找到该元素!\n");
} else {
printf("该元素的位置为:%d\n", pos);
}
// ...
}
```
完整代码如下:
阅读全文