先依次输入元素为简单类型(int、char)的数个数据元素建立顺序存储的线性表,然后以该线性表为查找表进行顺序查找;再再用冒泡排序对该线性表按某个关键字值进行排序,在排序之后的线性表之上进行折半查找。用C语言实现
时间: 2024-03-15 09:44:38 浏览: 57
好的,我来给您讲解一下。
首先,我们需要定义一个顺序存储的线性表结构体,如下所示:
```c
#define MAXSIZE 100 // 定义线性表最大长度
typedef struct {
int data[MAXSIZE]; // 存储数据元素的数组
int length; // 线性表长度
} SqList;
```
接下来,我们需要实现输入函数,用于动态创建线性表:
```c
void InitList(SqList *L)
{
int i = 0, n;
printf("请输入线性表长度:");
scanf("%d", &n);
printf("请输入线性表元素:");
for (i = 0; i < n; i++) {
scanf("%d", &L->data[i]);
}
L->length = n;
}
```
然后,我们可以实现顺序查找函数:
```c
int SeqSearch(SqList L, int key)
{
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == key) {
return i;
}
}
return -1;
}
```
接下来,我们实现冒泡排序函数:
```c
void BubbleSort(SqList *L)
{
int i, j, flag = 1;
for (i = 0; i < L->length - 1 && flag; i++) {
flag = 0;
for (j = L->length - 1; j > i; 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;
flag = 1;
}
}
}
}
```
最后,我们实现折半查找函数:
```c
int BinarySearch(SqList L, int key)
{
int low = 0, high = L.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (L.data[mid] == key) {
return mid;
} else if (L.data[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
```
完整代码如下:
```c
#include <stdio.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
void InitList(SqList *L)
{
int i = 0, n;
printf("请输入线性表长度:");
scanf("%d", &n);
printf("请输入线性表元素:");
for (i = 0; i < n; i++) {
scanf("%d", &L->data[i]);
}
L->length = n;
}
int SeqSearch(SqList L, int key)
{
int i;
for (i = 0; i < L.length; i++) {
if (L.data[i] == key) {
return i;
}
}
return -1;
}
void BubbleSort(SqList *L)
{
int i, j, flag = 1;
for (i = 0; i < L->length - 1 && flag; i++) {
flag = 0;
for (j = L->length - 1; j > i; 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;
flag = 1;
}
}
}
}
int BinarySearch(SqList L, int key)
{
int low = 0, high = L.length - 1;
while (low <= high) {
int mid = (low + high) / 2;
if (L.data[mid] == key) {
return mid;
} else if (L.data[mid] < key) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main()
{
SqList L;
int key;
InitList(&L);
printf("请输入要查找的元素:");
scanf("%d", &key);
int pos = SeqSearch(L, key);
if (pos == -1) {
printf("%d不存在于线性表中\n", key);
} else {
printf("%d的位置是%d\n", key, pos);
}
BubbleSort(&L);
printf("排序后的线性表为:");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n请输入要查找的元素:");
scanf("%d", &key);
pos = BinarySearch(L, key);
if (pos == -1) {
printf("%d不存在于线性表中\n", key);
} else {
printf("%d的位置是%d\n", key, pos);
}
return 0;
}
```
这样就完成了基于顺序存储的线性表的顺序查找和折半查找了。
阅读全文