输入学号、选择课程名、输入修改后的成 绩。在数据文件score.txt中查找相应的记录进行修改,将修改后的线性表(学生情況表)数据输出到文件score.txt中。 ①分块查找的查找过程就分事下两步进行: 先在线性表中确定待查找的结点属于哪一 块,由于块与块之间按关键字大小有序,因此,块间查找可采用二分查找算法; ②在所确定的块内查找待查找的结点即可 无序也可有序,因此,块内查找一般可采用 顺序查找算法。找到指定结点后,按要求修 改结点中的有关数据。用C语言实现
时间: 2023-12-06 21:43:00 浏览: 72
以下是基于分块查找算法实现的修改程序:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
typedef struct {
int key;
int score;
} Node;
typedef struct {
Node data[MAX_SIZE];
int block_size;
int block_num;
int *index; // 指向块的最后一个元素的下标
} List;
// 初始化线性表
void init(List *list, int n) {
int i;
list->block_size = 10;
list->block_num = n / list->block_size + 1;
list->index = (int *) malloc(list->block_num * sizeof(int));
for (i = 0; i < list->block_num; i++) {
list->index[i] = -1;
}
}
// 插入元素
void insert(List *list, Node node) {
int i, j;
for (i = 0; i < list->block_num; i++) {
if (list->index[i] < list->block_size - 1) {
// 当前块未满
j = ++list->index[i];
list->data[i * list->block_size + j] = node;
break;
}
}
}
// 打印线性表
void print(List *list) {
int i, j;
for (i = 0; i < list->block_num; i++) {
printf("Block %d:\n", i);
for (j = 0; j <= list->index[i]; j++) {
printf("(%d, %d) ", list->data[i * list->block_size + j].key, list->data[i * list->block_size + j].score);
}
printf("\n");
}
}
// 二分查找块号
int search_block(List *list, int key) {
int low = 0, high = list->block_num - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
if (list->data[mid * list->block_size].key <= key && key <= list->data[(mid + 1) * list->block_size - 1].key) {
return mid;
} else if (list->data[mid * list->block_size].key > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1; // 未找到
}
// 顺序查找记录
int search_record(List *list, int key, int *pos) {
int i;
for (i = 0; i <= list->index[*pos]; i++) {
if (list->data[*pos * list->block_size + i].key == key) {
*pos = *pos * list->block_size + i;
return 1; // 找到
}
}
return 0; // 未找到
}
// 修改记录
void modify(List *list, int key, int score) {
int pos = search_block(list, key);
if (pos != -1) {
if (search_record(list, key, &pos)) {
list->data[pos].score = score;
} else {
printf("Record not found.\n");
}
} else {
printf("Block not found.\n");
}
}
int main() {
List list;
Node node;
int n, i, key, score;
printf("Enter number of students: ");
scanf("%d", &n);
init(&list, n);
printf("Enter student information:\n");
for (i = 0; i < n; i++) {
printf("Student %d (key score): ", i + 1);
scanf("%d %d", &node.key, &node.score);
insert(&list, node);
}
printf("Current student information:\n");
print(&list);
printf("Enter student key and new score: ");
scanf("%d %d", &key, &score);
modify(&list, key, score);
printf("Updated student information:\n");
print(&list);
return 0;
}
```
该程序通过初始化函数 `init` 来确定分块的大小和数量,并通过一个指向每个块最后一个元素的下标的一维数组来实现分块。插入元素时,从第一块开始遍历,找到第一个未满的块并插入元素。查找块号时,采用二分查找算法,然后在对应的块内顺序查找记录。修改记录时,先查找块号,再在对应的块内顺序查找记录,并修改成绩。
阅读全文