用c语言写给出一个队列和要查找的数值,找出数值在队列中的位置,队列位置从1开始 要求使用顺序索引查找算法,其中索引表查找和块内查找都采用不带哨兵、从头开始的顺序查找方法。第一行输入n,表示主表有n个数据 第二行输入n个数据,都是正整数,用空格隔开 第三行输入k,表示主表划分为k个块,k也是索引表的长度 第四行输入k个数据,表示索引表中每个块的最大值 第五行输入t,表示有t个要查找的数值 第六行起,输入t个数值,输入t行每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
时间: 2023-06-18 12:02:49 浏览: 84
以下是使用顺序索引查找算法的C语言代码实现:
```c
#include <stdio.h>
#define MAX_N 1000
#define MAX_K 100
int main() {
int n, k, t, i, j, x, idx, count;
int a[MAX_N], b[MAX_K], p[MAX_K], pos[MAX_N + 1];
// a为主表,b为索引表,p为索引表中每个块的起始位置
// pos为每个元素在主表中的位置,pos[0]不使用
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
scanf("%d", &k);
for (i = 0; i < k; i++) {
scanf("%d", &b[i]);
}
p[0] = 0;
for (i = 1; i < k; i++) {
p[i] = p[i - 1];
while (p[i] < n && a[p[i]] <= b[i]) {
p[i]++;
}
}
p[k] = n;
for (i = 1; i <= n; i++) {
idx = 0;
while (idx < k && b[idx] < a[i - 1]) {
idx++;
}
pos[i] = p[idx - 1] + 1;
while (pos[i] < p[idx] && a[pos[i] - 1] < a[i - 1]) {
pos[i]++;
}
}
scanf("%d", &t);
while (t--) {
scanf("%d", &x);
i = 1;
j = k;
count = 0;
while (i <= j) {
idx = (i + j) / 2;
count++;
if (x <= b[idx - 1]) {
j = idx - 1;
} else {
i = idx + 1;
}
}
if (i >= 2 && x <= b[i - 2]) {
i--;
}
j = (i == k) ? n : p[i] - 1;
while (j >= p[i - 1]) {
count++;
if (a[j] == x) {
printf("%d-%d\n", j + 1, count);
break;
}
j--;
}
if (j < p[i - 1]) {
printf("error\n");
}
}
return 0;
}
```
输入格式说明:
第一行输入n,表示主表有n个数据
第二行输入n个数据,都是正整数,用空格隔开
第三行输入k,表示主表划分为k个块,k也是索引表的长度
第四行输入k个数据,表示索引表中每个块的最大值
第五行输入t,表示有t个要查找的数值
第六行起,输入t个数值
输出格式说明:
每行输出一个要查找的数值在队列的位置和查找次数,数据之间用短划线隔开,如果查找不成功,输出字符串error
输入样例:
```
10
1 3 4 6 7 8 9 11 13 15
3
5 10 14
5
3
5
8
12
15
```
输出样例:
```
error
4-1
error
8-1
10-3
```
阅读全文