先依次输入元素为简单类型(int、char)的数个数据元素建立顺序存储的线性表,然后以该线性表为查找表进行顺序查找;再用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。用C语言实现
时间: 2024-03-04 20:48:49 浏览: 59
p519021910944_2.1_M?n_合并线性表_p2.1_coach579_
好的,以下是实现代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义线性表结构体
typedef struct {
int* data; // 数据指针
int length; // 线性表长度
} SqList;
// 初始化线性表
void InitList(SqList* L, int length) {
L->data = (int*)malloc(sizeof(int) * length); // 申请内存
L->length = length;
printf("请输入 %d 个整数:\n", length);
for (int i = 0; i < length; i++) {
scanf("%d", &(L->data[i])); // 逐个输入数据元素
}
}
// 顺序查找
int SequentialSearch(SqList L, int key) {
for (int i = 0; i < L.length; i++) {
if (L.data[i] == key) {
return i; // 找到返回下标
}
}
return -1; // 未找到返回-1
}
// 冒泡排序
void BubbleSort(SqList* L) {
for (int i = 0; i < L->length - 1; i++) {
for (int j = 0; j < L->length - i - 1; j++) {
if (L->data[j] > L->data[j + 1]) {
int temp = L->data[j];
L->data[j] = L->data[j + 1];
L->data[j + 1] = temp;
}
}
}
}
// 折半查找
int BinarySearch(SqList L, int key) {
int left = 0, right = L.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (L.data[mid] == key) {
return mid;
} else if (L.data[mid] < key) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1; // 未找到返回-1
}
int main() {
SqList L;
int length, key;
printf("请输入线性表长度:\n");
scanf("%d", &length);
InitList(&L, length);
printf("请输入要查找的关键字:\n");
scanf("%d", &key);
int index = SequentialSearch(L, key);
if (index != -1) {
printf("在顺序表中找到了关键字 %d,下标为 %d\n", key, index);
} else {
printf("在顺序表中未找到关键字 %d\n", key);
}
BubbleSort(&L);
printf("排序后的线性表为:\n");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n请输入要查找的关键字:\n");
scanf("%d", &key);
index = BinarySearch(L, key);
if (index != -1) {
printf("在排序后的线性表中找到了关键字 %d,下标为 %d\n", key, index);
} else {
printf("在排序后的线性表中未找到关键字 %d\n", key);
}
free(L.data); // 释放内存
return 0;
}
```
希望可以帮到你!
阅读全文