算法思路:将索引结点放到一个队列中,将每块中的数据放到一个链表中
优点:使用链表的方式在添加删除元素时更加的方便,不需要改变其他元素的位置,只需要修改元素的指针就行了。
运行结果,包含了运行成功和失败的结果。
具体代码:
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
//使用链表的方式进行了分块查询
typedef struct List{
int elem; // 元素值
struct List *next; // 指向下一个节点的指针
}List, *LinkList;
typedef struct{
LinkList Elem; // 存储每个分区的头节点指针数组
}Node;
void Initial(Node T, int y){
for(int i = 1; i <= y; i++){
T.Elem[i].next = NULL; // 初始化每个分区的头节点指针为NULL
}
}
int Search(Node T, ElemType e, int y){
for(int i = 1; i <= y; i++){
if(e <= T.Elem[i].elem){ // 如果要查找的元素值小于等于当前分区的最大元素值
while(T.Elem[i].next != NULL){ // 遍历当前分区的链表
if(e == T.Elem[i].next->elem){ // 如果找到了目标元素
printf("元素在第%d块分区", i);
return i;
}else{
T.Elem[i].next = T.Elem[i].next->next; // 遍历下一个节点
}
}
}
}
printf("没有找到该元素!");
return -1;
}
int main(){
Node T;
int x, y, z;
printf("请输入分块的大小和数量:");
scanf("%d%d", &x, &y);
T.Elem = (LinkList)malloc(y * sizeof(List)); // 分配存储头节点指针的数组的内存空间
for(int i = 1; i <= y; i++){
T.Elem[i].elem = 2 * i * y; // 设置每个分区的最大元素值(多乘一个2方便数据的输入,可以根据实际需求修改)
}
Initial(T, y);
List *p;
for(int i = 1; i <= y; i++){
printf("请输入第%d个分区的数据:", i);
for(int j = 1; j <= x; j++){
scanf("%d", &z);
p = (List*)malloc(sizeof(List));
p->elem = z;
p->next = T.Elem[i].next; // 将新节点插入到当前分区的链表头部
T.Elem[i].next = p;
}
}
printf("请输入要查询的元素值:");
scanf("%d", &z);
Search(T, z, y);
return 1;
}