题目:写入学生学号、姓名、成绩,按照学号进行递增排序并查找相应信息。
算法提示
1.定义结点结构体:学号、姓名、成绩
2.定义函数一作用:按照学号进行排序(递增)
3.使用二分法进行查找
4.打印结果
可以参考这个问题的回答:https://ask.csdn.net/questions/7948344?answer=54206705
输入:
请输入第1个学生的学号,姓名,性别,年龄,三门课成绩:3 邹研研 女 22 90 80 140
该学生的平均成绩为:103.33
请输入第2个学生的学号,姓名,性别,年龄,三门课成绩:2 葛新龙 男 21 66 44 150
该学生的平均成绩为:86.67
请输入第3个学生的学号,姓名,性别,年龄,三门课成绩:1 李文杰 男 21 88 66 120
该学生的平均成绩为:91.33
输出:
拍完序的结果为:
3 邹研研 女 22 90 80 140 103.33
1 葛新龙 男 21 66 44 150 86.67
2 李文杰 男 21 88 66 120 91.33
下面是一个基于C语言的示例代码,实现了按照学号递增排序和二分查找相应信息的功能。代码中使用了链表作为存储结构,每个节点包含学号、姓名和成绩信息。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体
typedef struct Student {
int studentID;
char name[50];
int score;
struct Student* next;
} Student;
// 创建新节点
Student* createNode(int studentID, char* name, int score) {
Student* newNode = (Student*)malloc(sizeof(Student));
newNode->studentID = studentID;
strcpy(newNode->name, name);
newNode->score = score;
newNode->next = NULL;
return newNode;
}
// 插入节点到链表
void insertNode(Student** head, Student* newNode) {
if (*head == NULL || newNode->studentID < (*head)->studentID) {
newNode->next = *head;
*head = newNode;
} else {
Student* current = *head;
while (current->next != NULL && current->next->studentID < newNode->studentID) {
current = current->next;
}
newNode->next = current->next;
current->next = newNode;
}
}
// 按学号递增排序
void sortByStudentID(Student** head) {
Student* sortedList = NULL;
Student* current = *head;
while (current != NULL) {
Student* nextNode = current->next;
insertNode(&sortedList, current);
current = nextNode;
}
*head = sortedList;
}
// 二分查找学生信息
Student* binarySearch(Student* head, int studentID) {
Student* left = head;
Student* right = NULL;
while (left != right) {
Student* mid = left;
int count = 0;
while (mid != right) {
mid = mid->next;
count++;
}
int steps = count / 2;
mid = left;
while (steps > 0) {
mid = mid->next;
steps--;
}
if (mid->studentID < studentID) {
left = mid->next;
} else {
right = mid;
}
}
if (right != NULL && right->studentID == studentID) {
return right;
} else {
return NULL;
}
}
// 打印学生信息
void printStudent(Student* student) {
if (student != NULL) {
printf("学号:%d\n", student->studentID);
printf("姓名:%s\n", student->name);
printf("成绩:%d\n", student->score);
} else {
printf("未找到该学生信息\n");
}
}
// 释放链表内存
void freeList(Student* head) {
while (head != NULL) {
Student* current = head;
head = head->next;
free(current);
}
}
int main() {
// 创建学生信息链表
Student* head = NULL;
insertNode(&head, createNode(102, "Alice", 85));
insertNode(&head, createNode(104, "Bob", 92));
insertNode(&head, createNode(103, "Charlie", 78));
insert
Node(&head, createNode(101, "David", 90));
// 按学号排序
sortByStudentID(&head);
// 二分查找学生信息
int searchID = 103;
Student* foundStudent = binarySearch(head, searchID);
// 打印结果
printStudent(foundStudent);
// 释放链表内存
freeList(head);
return 0;
}
以上代码示例创建了一个学生信息的链表,并通过insertNode
函数将学生节点按学号递增顺序插入链表中。然后,通过sortByStudentID
函数对链表按学号进行排序。接着,使用binarySearch
函数进行二分查找指定学号的学生信息,并通过printStudent
函数打印查找结果。最后,使用freeList
函数释放链表所占内存。
请根据你的实际需求将示例代码进行适当修改