用c语言选取一个合适的数据结构存储数据,设计一学生成绩表,能对数据进行插入、 删除、统计总分、按总分从大到小排序、查找等。

时间: 2023-12-20 08:07:50 浏览: 36
可以使用链表来存储学生成绩表,每个节点存储一个学生的信息,包括学号、姓名、各科成绩和总分。链表的每个节点都有一个指针指向下一个节点,可以方便地进行插入和删除操作。以下是一个简单的实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define NAME_LEN 20 // 姓名长度 #define MAX_SUBJECTS 10 // 最大科目数 // 学生信息结构体 typedef struct student { int id; // 学号 char name[NAME_LEN]; // 姓名 int scores[MAX_SUBJECTS]; // 各科成绩 int total; // 总分 struct student *next; // 下一个节点指针 } Student; // 插入节点 void insert_student(Student **head, Student *new_student) { if (*head == NULL) { // 链表为空,直接插入 *head = new_student; } else if (new_student->total > (*head)->total) { // 新节点总分最高,插入到链表头部 new_student->next = *head; *head = new_student; } else { // 插入到适当位置 Student *prev = *head; Student *curr = (*head)->next; while (curr != NULL && new_student->total <= curr->total) { prev = curr; curr = curr->next; } prev->next = new_student; new_student->next = curr; } } // 删除节点 void delete_student(Student **head, int id) { if (*head == NULL) { // 链表为空 return; } if ((*head)->id == id) { // 链表头部节点是要删除的节点 Student *temp = *head; *head = (*head)->next; free(temp); return; } Student *prev = *head; Student *curr = (*head)->next; while (curr != NULL && curr->id != id) { prev = curr; curr = curr->next; } if (curr != NULL) { // 找到要删除的节点 prev->next = curr->next; free(curr); } } // 统计总分 int calculate_total(Student *student) { int total = 0; for (int i = 0; i < MAX_SUBJECTS; i++) { total += student->scores[i]; } student->total = total; return total; } // 按总分从大到小排序 void sort_students(Student **head) { Student *curr = *head; *head = NULL; while (curr != NULL) { Student *temp = curr; curr = curr->next; temp->next = NULL; insert_student(head, temp); // 插入到新链表的适当位置 } } // 查找节点 Student *find_student(Student *head, int id) { while (head != NULL && head->id != id) { head = head->next; } return head; } // 显示学生信息 void display_student(Student *student) { printf("学号:%d,姓名:%s,各科成绩:", student->id, student->name); for (int i = 0; i < MAX_SUBJECTS; i++) { printf("%d ", student->scores[i]); } printf(",总分:%d\n", student->total); } // 显示学生列表 void display_students(Student *head) { while (head != NULL) { display_student(head); head = head->next; } } int main() { Student *head = NULL; while (1) { printf("请选择操作:\n"); printf("1. 插入学生信息\n"); printf("2. 删除学生信息\n"); printf("3. 统计总分\n"); printf("4. 按总分从大到小排序\n"); printf("5. 查找学生信息\n"); printf("6. 显示学生列表\n"); printf("0. 退出程序\n"); int choice; scanf("%d", &choice); switch (choice) { case 1: { // 插入学生信息 Student *new_student = (Student *)malloc(sizeof(Student)); printf("请输入学号:"); scanf("%d", &(new_student->id)); printf("请输入姓名:"); scanf("%s", new_student->name); printf("请输入各科成绩(最多%d科):", MAX_SUBJECTS); for (int i = 0; i < MAX_SUBJECTS; i++) { if (scanf("%d", &(new_student->scores[i])) != 1) { new_student->scores[i] = 0; } } calculate_total(new_student); // 计算总分 insert_student(&head, new_student); // 插入节点 printf("学生信息插入成功!\n"); break; } case 2: { // 删除学生信息 printf("请输入要删除的学生的学号:"); int id; scanf("%d", &id); delete_student(&head, id); // 删除节点 printf("学生信息删除成功!\n"); break; } case 3: { // 统计总分 printf("请输入要统计总分的学生的学号:"); int id; scanf("%d", &id); Student *student = find_student(head, id); // 查找节点 if (student != NULL) { int total = calculate_total(student); // 计算总分 printf("学生%d的总分为%d\n", id, total); } else { printf("找不到学号为%d的学生!\n", id); } break; } case 4: { // 按总分从大到小排序 sort_students(&head); printf("学生信息已按总分从大到小排序!\n"); break; } case 5: { // 查找学生信息 printf("请输入要查找的学生的学号:"); int id; scanf("%d", &id); Student *student = find_student(head, id); // 查找节点 if (student != NULL) { display_student(student); // 显示学生信息 } else { printf("找不到学号为%d的学生!\n", id); } break; } case 6: { // 显示学生列表 display_students(head); break; } case 0: { // 退出程序 exit(0); } default: { printf("无效的操作!\n"); break; } } } return 0; } ``` 注意,以上代码只是一个简单的实现,还有很多可以优化的地方,比如可以使用二叉树或哈希表来提高查找的效率。

相关推荐

最新推荐

recommend-type

学生成绩管理系统(数据结构)实验报告.docx

期末实践周必备(数据结构)学生成绩管理系统,基于C语言完成的,百分百作者原创,资源保证!
recommend-type

C语言:一元多项式加减法运算(链表 附答案).docx

C语言链表的入门题,里面提供了两种思路供参考,用链表来实现一元多项式的加减法,并按照一定规律输出。也是练习链表和排序算法的一道小实验,初学链表的小伙伴可以参考参考噢
recommend-type

数据结构,课程设计,c语言,一元多项式计算

数据结构,课程设计,c语言,一元多项式计算。顺序结构、动态链表结构下的一元多项式的加法、减法、乘法的实现。 设有一元多项式Am(x)和Bn(x). Am(x)=A0+A1x1+A2x2+A3x3+… +Amxm Bn(x)=B0+B1x1+B2x2+B3x3+… +...
recommend-type

数据结构(C语言版)1800道题及答案[完整版].doc

数据结构(C语言)1800道题与答案,数据结构,C语言,题目与答案,可用于复习考研,可做学习用。童叟无欺
recommend-type

C语言程序设计实现学生成绩记录簿

通过编写c语言《学生成绩记录簿系统...3)C语言程序设计的主要任务是要求学生遵循软件开发过程的基本规范,运用结构化程序设计的方法,按照课程设计的题目要求,分析、设计、编写、调试和测试C语言程序及编写设计报告。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

2. 通过python绘制y=e-xsin(2πx)图像

可以使用matplotlib库来绘制这个函数的图像。以下是一段示例代码: ```python import numpy as np import matplotlib.pyplot as plt def func(x): return np.exp(-x) * np.sin(2 * np.pi * x) x = np.linspace(0, 5, 500) y = func(x) plt.plot(x, y) plt.xlabel('x') plt.ylabel('y') plt.title('y = e^{-x} sin(2πx)') plt.show() ``` 运行这段
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。