问题描述:设计一个方便、快捷、高效的学生成绩管理系统。
1.基本要求
(1)利用单链表存储内容:学号、姓名、英语、数学、C语言、总分、平均分及名次等信息;
(2)具备创建、添加、删除、查询(按学号、姓名等查询)、修改、排序、显示等功能;
(3)实现最高分、最低分、平均分、不及格人数等的统计;
(4)界面美观、操作简便。
2.重点、难点
重点:单链表的建立、遍历、查询、插入、修改、删除等操作。
难点:文件的读写操作。
对于你这个问题可以参考如下链接:
https://wenku.baidu.com/view/e43f3f0fbe64783e0912a21614791711cc797992.html
https://blog.csdn.net/weixin_45386459/article/details/121575888
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _student{
char name[20];
int age;
int stuNum;
int score;
}student;
typedef struct _Node{
student stu1;
struct _Node* pNext;
}Node;
Node *g_head=NULL;
void menu(){
printf("------------------\n");
printf("- 1录入信息-\n");
printf("- 2查看信息-\n");
printf("- 3保存信息-\n");
printf("- 4读取信息-\n");
printf("- 5统计人数-\n");
printf("- 6查找信息-\n");
printf("- 7修改信息-\n");
printf("- 8删除信息-\n");
printf("- 0退出-\n");
printf("退出不要直接点叉,请按0退出!\n查看文件之前请先读取文件!\n");
}
void input(){
printf("请输入学生信息\t\n");
Node *pNewNode=(Node*)malloc(sizeof(Node));//创建一个新节点。
pNewNode->pNext=NULL;
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
printf("请输入姓名: ");
scanf("%s",pNewNode->stu1.name);
printf("请输入年龄: ");
scanf("%d",&pNewNode->stu1.age);
printf("请输入学号 : ");
scanf("%d",&pNewNode->stu1.stuNum);
printf("请输入成绩 : ");
scanf("%d",&pNewNode->stu1.score);
printf("该学生信息输入完毕!\n\n");
}
void printdate(){
Node* p=g_head;
printf("\t姓名\t年龄\t学号\t成绩\n");
while(p!=NULL)
{
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
p=p->pNext;
}
}
void save(){
FILE *fp=fopen("E:\\stu.data","w");
if(fp==NULL){
printf("文件打开失败");
return;
}
Node* p=g_head;
while(p!=NULL){
fwrite(&p->stu1,1,sizeof(student),fp);
p=p->pNext;
}
fclose(fp);
printf("文件保存成功!\n");
}
void rs(){
FILE* fp=fopen("E:\\stu.data","r");
if(fp==NULL){
printf("文件打开失败");
}
printf("文件读取成功!\n 查看文件请按2\n");
student stu;
while(fread(&stu,1,sizeof(student),fp)){
Node* pNewNode=(Node*)malloc(sizeof(Node));
pNewNode->pNext=NULL;
memcpy(pNewNode,&stu,sizeof(student));
if(g_head==NULL){
g_head=pNewNode;
}
else{
pNewNode->pNext=g_head;
g_head=pNewNode;
}
}
}
void count(){
int a=0;
FILE* fp=fopen("E:\\stu.data","r");
if(fp==NULL){
printf("文件打开失败");
return;
}
Node* p=g_head;
while(p!=NULL){
p=p->pNext;
a++;
}
printf("总人数%d",a);
}
void find(){
int num;
printf("请输入要查找的学生学号: \n");
scanf("%d",&num);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.stuNum==num){
printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.age,p->stu1.stuNum,p->stu1.score);
}
p=p->pNext;
}
printf("have not");
}
void change(){
int num;
printf("请输入要修改的学生的学号: ");
scanf("%d",&num);
Node* p=g_head;
while(p!=NULL){
if(p->stu1.stuNum==num){
printf("请输入姓名: \n");
scanf("%s",p->stu1.name);
printf("请输入年龄: \n");
scanf("%d",&p->stu1.age);
printf("请输入学号: \n");
scanf("%d",&p->stu1.stuNum);
printf("请输入成绩: \n");
scanf("%d",&p->stu1.score);
printf("信息更改完毕!");
}
p=p->pNext;
}
if(p==NULL){
printf("该学生不存在!\n");
}
}
void del(){
int num;
printf("请输入要删除的学号");
scanf("%d",&num);
Node* p=g_head;
Node*p1,*p2;
if(p->stu1.stuNum==num){
p1=p->pNext;
free(p1);
}
if(p->pNext!=NULL){
p2=p->pNext;
p->pNext=p->pNext->pNext;
free(p2);
}
printf("学号为%d的信息删除成功!\n",num);
}
int main()
{
menu();
while(1)
{
char ch=getch();
switch(ch){
case '1':input();break;
case '2':printdate();break;
case '3':save();break;
case '4':rs();break;
case '5':count();break;
case '6':find();break;
case '7':change();break;
case '8':del();break;
case '0':exit(0);
}
}
return 0;
}
如有帮助,请点击我的回答下方的【采纳该答案】按钮帮忙采纳下,谢谢!
链表的基本操作。可以参考类似的例子自己写一下,都是很类似的东西。
参考:
https://blog.csdn.net/qfl_sdu/article/details/118326835?spm=1001.2014.3001.5502