先依次输入元素为简单类型(int、char)或自定义结构体类型(如订单信息或学生信息或员工信息)的数个数据元素建立顺序存储的线性表,然后①以该线性表为查找表进行顺序查找;②用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。用C语言实现
时间: 2024-03-04 18:48:48 浏览: 113
好的,以下是 C 语言实现的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 自定义结构体类型
typedef struct {
char name[20];
int age;
} Student;
// 定义线性表结构体
typedef struct {
void *data; // 指向数据的指针
int length; // 线性表长度
int size; // 数据元素大小
} List;
// 初始化线性表
void initList(List *list, int size, int length) {
list->data = malloc(size * length);
list->length = 0;
list->size = size;
}
// 增加元素
void add(List *list, void *data) {
memcpy((char*)list->data + list->length * list->size, data, list->size);
list->length++;
}
// 顺序查找
int seqSearch(List *list, void *key, int (*cmp)(const void *, const void *)) {
for (int i = 0; i < list->length; i++) {
if (cmp((char*)list->data + i * list->size, key) == 0) {
return i;
}
}
return -1;
}
// 冒泡排序
void bubbleSort(List *list, int (*cmp)(const void *, const void *)) {
for (int i = 0; i < list->length - 1; i++) {
for (int j = 0; j < list->length - i - 1; j++) {
if (cmp((char*)list->data + j * list->size, (char*)list->data + (j + 1) * list->size) > 0) {
// 交换相邻两个元素
char *temp = malloc(list->size);
memcpy(temp, (char*)list->data + j * list->size, list->size);
memcpy((char*)list->data + j * list->size, (char*)list->data + (j + 1) * list->size, list->size);
memcpy((char*)list->data + (j + 1) * list->size, temp, list->size);
free(temp);
}
}
}
}
// 折半查找
int binarySearch(List *list, void *key, int (*cmp)(const void *, const void *)) {
int low = 0, high = list->length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (cmp((char*)list->data + mid * list->size, key) == 0) {
return mid;
} else if (cmp((char*)list->data + mid * list->size, key) < 0) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
// 比较函数,用于比较两个学生的年龄
int cmp(const void *a, const void *b) {
return ((Student*)a)->age - ((Student*)b)->age;
}
int main() {
// 建立顺序存储的线性表
List list;
initList(&list, sizeof(Student), 5);
Student s1 = {"Tom", 18};
Student s2 = {"Jerry", 20};
Student s3 = {"Lucy", 19};
Student s4 = {"Peter", 22};
Student s5 = {"Mary", 21};
add(&list, &s1);
add(&list, &s2);
add(&list, &s3);
add(&list, &s4);
add(&list, &s5);
// 顺序查找
Student key1 = {"Jerry", 0};
int index1 = seqSearch(&list, &key1, cmp);
if (index1 == -1) {
printf("未找到该学生\n");
} else {
printf("该学生的位置为:%d\n", index1);
}
// 冒泡排序
bubbleSort(&list, cmp);
// 折半查找
Student key2 = {"Peter", 0};
int index2 = binarySearch(&list, &key2, cmp);
if (index2 == -1) {
printf("未找到该学生\n");
} else {
printf("该学生的位置为:%d\n", index2);
}
// 释放内存
free(list.data);
return 0;
}
```
上述代码中,我们使用了 void 指针和 memcpy 函数来实现对不同数据类型的支持。在比较函数 cmp 中,我们比较的是两个学生的年龄大小。您可以根据实际需要修改代码中的数据类型和比较函数。
阅读全文