通过C语言应用线性表存储班级学生的签到信息排序实现二分查找;实现二叉排序树的搜索和插入算法,要求改写基础程序当学生输入自己的姓名信息后,查找本学期的出勤信息,记录搜索的次数。给出main函数、线性表的排序函数、二分搜索函数。
时间: 2024-02-13 15:03:02 浏览: 22
好的,我会尽力回答你的问题。首先,我需要说明一下,我是一个语言模型 AI,没有实际的能力去运行程序,我只能提供一些思路和代码实现方面的建议,帮助你更好地理解和实现这段程序。
那么,针对你的问题,我可以给出以下思路和代码实现建议:
首先,我们需要定义一个学生结构体,用来存储学生的姓名和出勤信息。
```c
#define NAME_LEN 20 // 姓名最大长度
// 学生结构体
typedef struct {
char name[NAME_LEN]; // 学生姓名
int attendance; // 学生出勤信息
} student;
```
然后,我们需要定义一个线性表结构体,用来存储学生信息,并实现线性表的排序功能。
```c
#define MAX_STUDENT_NUM 100 // 最大学生数
// 线性表结构体
typedef struct {
student students[MAX_STUDENT_NUM]; // 学生数组
int size; // 学生数
} student_list;
// 线性表排序函数,按学生出勤信息从小到大排序
void sort_student_list(student_list *list) {
int i, j;
for (i = 0; i < list->size - 1; i++) {
for (j = 0; j < list->size - 1 - i; j++) {
if (list->students[j].attendance > list->students[j+1].attendance) {
student temp = list->students[j];
list->students[j] = list->students[j+1];
list->students[j+1] = temp;
}
}
}
}
```
接着,我们需要实现二分查找函数,用来在已排序的线性表中查找指定学生的出勤信息,并记录搜索次数。
```c
// 二分查找函数,返回学生出勤信息,记录搜索次数
int binary_search(student_list *list, char *name, int *search_count) {
int left = 0, right = list->size - 1;
while (left <= right) {
int mid = (left + right) / 2;
(*search_count)++; // 记录搜索次数
if (strcmp(name, list->students[mid].name) == 0) {
return list->students[mid].attendance;
} else if (strcmp(name, list->students[mid].name) < 0) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1; // 没有找到指定学生
}
```
最后,我们需要实现二叉排序树的搜索和插入算法。
```c
// 二叉排序树结构体
typedef struct bst_node {
student data; // 学生信息
struct bst_node *left; // 左子树
struct bst_node *right; // 右子树
} bst_node;
// 二叉排序树的搜索算法
int bst_search(bst_node *root, char *name, int *search_count) {
if (root == NULL) {
return -1; // 没有找到指定学生
}
(*search_count)++; // 记录搜索次数
if (strcmp(name, root->data.name) == 0) {
return root->data.attendance;
} else if (strcmp(name, root->data.name) < 0) {
return bst_search(root->left, name, search_count);
} else {
return bst_search(root->right, name, search_count);
}
}
// 二叉排序树的插入算法
void bst_insert(bst_node **root, student data) {
if (*root == NULL) {
*root = (bst_node *)malloc(sizeof(bst_node));
(*root)->data = data;
(*root)->left = NULL;
(*root)->right = NULL;
} else if (data.attendance < (*root)->data.attendance) {
bst_insert(&((*root)->left), data);
} else {
bst_insert(&((*root)->right), data);
}
}
```
最后,我们需要在 main 函数中调用以上函数,实现学生信息的输入、排序、搜索和插入等功能。
```c
int main() {
student_list list;
int i, attendance, search_count;
char name[NAME_LEN];
bst_node *bst_root = NULL;
// 输入学生信息
printf("请输入学生数:");
scanf("%d", &(list.size));
printf("请依次输入学生姓名和出勤信息:\n");
for (i = 0; i < list.size; i++) {
scanf("%s %d", list.students[i].name, &(list.students[i].attendance));
bst_insert(&bst_root, list.students[i]); // 将学生信息插入二叉排序树
}
// 线性表排序
sort_student_list(&list);
// 二分查找
printf("请输入要查找的学生姓名:");
scanf("%s", name);
search_count = 0;
attendance = binary_search(&list, name, &search_count);
if (attendance != -1) {
printf("学生 %s 的出勤信息为 %d,共搜索了 %d 次\n", name, attendance, search_count);
} else {
printf("没有找到学生 %s 的出勤信息,共搜索了 %d 次\n", name, search_count);
}
// 二叉排序树搜索
printf("请输入要查找的学生姓名:");
scanf("%s", name);
search_count = 0;
attendance = bst_search(bst_root, name, &search_count);
if (attendance != -1) {
printf("学生 %s 的出勤信息为 %d,共搜索了 %d 次\n", name, attendance, search_count);
} else {
printf("没有找到学生 %s 的出勤信息,共搜索了 %d 次\n", name, search_count);
}
return 0;
}
```
希望以上代码实现方案能够对你有所帮助!