输入学号、选择课程名、输入修改后的成 绩。在数据文件score.txt中查找相应的记录进行修改,将修改后的线性表(学生情況表)数据输出到文件score.txt中。 ①分块查找的查找过程就分事下两步进行: 先在线性表中确定待查找的结点属于哪一 块,由于块与块之间按关键字大小有序,因此,块间查找可采用二分查找算法; ②在所确定的块内查找待查找的结点即可 无序也可有序,因此,块内查找一般可采用 顺序查找算法。找到指定结点后,按要求修 改结点中的有关数据。用C语言实现
时间: 2024-01-21 11:17:48 浏览: 79
以下是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 线性表最大长度
#define BLOCK_SIZE 10 // 每块最大长度
typedef struct {
int id;
char name[20];
char course[20];
float score;
} Student;
typedef struct {
Student data[BLOCK_SIZE];
int length;
} Block;
typedef struct {
Block blocks[MAX_SIZE / BLOCK_SIZE];
int block_num;
} List;
void init_list(List *list); // 初始化线性表
void insert(List *list, Student student); // 向线性表中插入数据
void save_list(List *list); // 将线性表保存到文件中
void modify_score(List *list, int id, char *course, float score); // 修改指定学生指定课程的成绩
int main() {
List list;
init_list(&list);
// 向线性表中插入数据
insert(&list, (Student) {1, "张三", "数学", 90});
insert(&list, (Student) {2, "李四", "语文", 80});
insert(&list, (Student) {3, "王五", "英语", 70});
insert(&list, (Student) {4, "赵六", "物理", 60});
// 打印线性表中的数据
printf("学号\t姓名\t课程\t成绩\n");
for (int i = 0; i < list.block_num; i++) {
for (int j = 0; j < list.blocks[i].length; j++) {
Student student = list.blocks[i].data[j];
printf("%d\t%s\t%s\t%.1f\n", student.id, student.name, student.course, student.score);
}
}
// 修改成绩
modify_score(&list, 2, "语文", 85);
modify_score(&list, 3, "英语", 75);
// 保存线性表到文件中
save_list(&list);
return 0;
}
/**
* 初始化线性表
*/
void init_list(List *list) {
list->block_num = 0;
}
/**
* 向线性表中插入数据
*/
void insert(List *list, Student student) {
// 如果当前块已满,则新建一块
if (list->block_num == 0 || list->blocks[list->block_num - 1].length >= BLOCK_SIZE) {
list->blocks[list->block_num].length = 0;
list->block_num++;
}
// 将数据插入到最后一块
list->blocks[list->block_num - 1].data[list->blocks[list->block_num - 1].length] = student;
list->blocks[list->block_num - 1].length++;
}
/**
* 将线性表保存到文件中
*/
void save_list(List *list) {
FILE *fp = fopen("score.txt", "w");
for (int i = 0; i < list->block_num; i++) {
for (int j = 0; j < list->blocks[i].length; j++) {
Student student = list->blocks[i].data[j];
fprintf(fp, "%d %s %s %.1f\n", student.id, student.name, student.course, student.score);
}
}
fclose(fp);
}
/**
* 修改指定学生指定课程的成绩
*/
void modify_score(List *list, int id, char *course, float score) {
// 分块查找
int left = 0, right = list->block_num - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (list->blocks[mid].data[0].id > id) {
right = mid - 1;
} else if (list->blocks[mid].data[list->blocks[mid].length - 1].id < id) {
left = mid + 1;
} else {
// 在当前块内查找
for (int i = 0; i < list->blocks[mid].length; i++) {
if (list->blocks[mid].data[i].id == id && strcmp(list->blocks[mid].data[i].course, course) == 0) {
list->blocks[mid].data[i].score = score;
return;
}
}
return;
}
}
}
```
以上代码实现了对学生情况表的分块查找和修改,并将修改后的结果保存到文件中。在实际使用中,可以根据需要进行修改和优化。
阅读全文