学生成绩管理系统动态顺序表
时间: 2025-01-03 22:27:10 浏览: 8
### 学生成绩管理系统的动态顺序表实现
#### 动态顺序表简介
动态顺序表是一种线性数据结构,其大小可以在运行时调整。相比于静态数组,动态顺序表更灵活,适合处理未知数量的数据项。对于学生成绩管理系统而言,使用动态顺序表可以方便地增加、删除学生记录,并且可以根据需求扩展存储空间。
#### 数据结构定义
为了实现学生成绩管理系统中的基本功能,需要定义一个合适的学生信息结构体以及相应的动态顺序表示例代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LENGTH 50
// 定义学生信息结构体
typedef struct {
char name[MAX_NAME_LENGTH]; // 姓名
int scores[5]; // 各科成绩 (假设最多五门课程)
} Student;
// 定义动态顺序表节点
typedef struct List {
Student *data; // 指向学生信息的指针
size_t size; // 当前元素个数
size_t capacity; // 总容量
} DynamicArray;
```
#### 初始化函数
创建一个新的动态顺序表实例,初始化为空列表。
```c
void initDynamicArray(DynamicArray *list, size_t initialCapacity) {
list->size = 0;
list->capacity = initialCapacity;
list->data = malloc(list->capacity * sizeof(Student));
}
```
#### 插入新学生信息
当录入新的学生成绩时,如果当前容量不足,则先扩容再插入新元素。
```c
int insertStudent(DynamicArray *list, const Student *student) {
if (list->size >= list->capacity) { // 如果满了就扩大一倍
list->capacity *= 2;
list->data = realloc(list->data, list->capacity * sizeof(Student));
if (!list->data) return -1; // 内存分配失败返回错误码
}
memcpy(&list->data[list->size++], student, sizeof(Student)); // 复制学生对象到末尾位置
return 0; // 成功执行完毕
}
```
#### 修改已有学生信息
通过遍历找到指定姓名对应的位置来更新该条目的具体字段值。
```c
int updateStudentScoreByName(DynamicArray *list, const char* targetName, int subjectIndex, int newScore){
for(size_t i=0;i<list->size;++i){
if(strcmp(list->data[i].name,targetName)==0){ // 找到了目标名字
if(subjectIndex>=0 && subjectIndex<=4){ // 验证科目索引合法性
list->data[i].scores[subjectIndex]=newScore;
return 0; // 更新成功退出循环
}else{
printf("Invalid Subject Index!\n");
return -2; // 科目编号越界报错
}
}
}
printf("No such student found.\n");
return -1; // 查无此人也报错
}
```
#### 统计与排序
计算每位同学的成绩总分及其平均分数;按照平均分降序排列所有记录。
```c
static void calculateTotalAndAverage(Student *s) {
s->total_score = 0;
for(int j=0;j<5;++j){
s->total_score += s->scores[j];
}
s->average_score = ((float)s->total_score)/5;
}
void sortStudentsByAvgDesc(DynamicArray *list) {
qsort(list->data, list->size, sizeof(Student), compare_students);
}
static int compare_students(const void *a, const void *b) {
float avg_a=((const Student *) a)->average_score;
float avg_b=((const Student *) b)->average_score;
if(avg_a>avg_b)return -1;
else if(avg_a==avg_b)return 0;
else return 1;
}
```
以上展示了如何利用 C 语言中的动态内存管理和标准库函数 `qsort` 来构建一个简单的基于动态顺序表的学生信息系统[^1]。
阅读全文