IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 成绩管理系统 -> 正文阅读

[数据结构与算法]成绩管理系统

课程设计:成绩管理系统

要求:1能够录入新的学生成绩,学生姓名,学号

2.可以按照姓名修改学生成绩

3.可以按照学号修改学生成绩

4能够按照姓名查找学生成绩

5按照学号查询学生成绩

6.能够查询某科目的选课学生信息

7.输出某科目学生成绩排名

8按照学生平均分输出学生总排名

9.能将学生信息存入文件

总的思路是写八个函数实现1-8 八个功能,然后根据用户的选择依次调用,数据结构运用链表

首先定义结点的结构,结构体里面要有姓名,学科,学号,总分,,整个结点起个名字叫studentNode

typedef struct
{
	char name[15];
	int number;
	int python;
	int C;
	int java;
	int average;
	int sum;
} student;

typedef struct node
{
	student stu;
	struct node* next;	//指针域,指向下一个节点
} studentNode;			//学生节点

给整个链表加上个头指针和尾指针,并用count计算共有几个节点,便于从文件里面取出数据和录入数据

typedef struct
{
	studentNode* head;	//头指针
	studentNode* tail;	//尾指针
	int count;			//学生节点总数
} studentList;			//学生链表

接着写各个功能的函数,提前声明

void enter(studentList* L);		//输入成绩
void display(studentList* L);	//显示某科目学生
void display1(studentList* L);
void find(studentList* L);       //姓名查找某人
void find1(studentList* L);		//学号查找某人
void modify(studentList* L);	//靠名字修改
void modify1(studentList* L);	//靠学号修改
void sort(studentList* L);		//降序重新建表并输出
void sort1(studentList* L);        //对某科排序
void write(studentList* L);		//写入文件,边写边释放空间
void read(studentList* L);		//读取文件,边读边建表

并通过main函数和case或者if进行选择函数运行

int main() {

	printf("		**************学生成绩管理系统**************\n");
	printf("		*  1.录入新的学生成绩                      *\n");//ok,但无课程编号
	printf("		*  2.按姓名修改学生成绩                    *\n");//ok
	printf("		*  3.按学号修改学生成绩                    *\n");//ok
	printf("		*  4.按姓名查询学生成绩                    *\n");//ok
	printf("		*  5.按学号查询学生成绩                    *\n");//ok
	printf("		*  6.查询某科目的选课学生信息              *\n");//ok
	printf("		*  7.输出某科目的学生成绩排名              *\n");
	printf("		*  8.按平均分输出学生成绩                  *\n");//ok
	printf("		*  9.退出学生成绩管理系统                  *\n");//ok
	printf("		********************************************\n");
	printf("  	                                                \n");

enter函数:先创建一个节点,然后录入哥各个信息,最后将这个结点运用头插法插入链表头部

void enter(studentList* L)录入学生成绩
{
	//创建新空间
	studentNode* s = (studentNode*)malloc(sizeof(studentNode));
	//对这个空间的量进行赋值
	printf("请输入学生姓名:");
	scanf("%s",s->stu.name);
	printf("请输入学生学号:");
	scanf("%d", &s->stu.number);
	printf("请输入python成绩:");
	scanf("%d", &s->stu.python);
	printf("请输入C成绩:");
	scanf("%d", &s->stu.C);
	printf("请输入java成绩:");
	scanf("%d", &s->stu.java);
	(*s).stu.sum = s->stu.python + s->stu.C + s->stu.java;
	s->stu.average = s->stu.sum / 3;
	//若链表为空,将尾指针指向这个储存空间
	if (L->head == L->tail) {
		L->tail = s;
	}
	//将这个储存空间插进链表(放在head后面)
	s->next = L->head->next;
	L->head->next = s;
	L->count++;
	//功能完成
	printf("信息录入成功!\n\n");
}

display函数:输出选择某学科的学生

先输入学科,然后在链表中逐个进行判断,因为没有选择本学科的学生这一课得分为0分,所以不是零分的学生都选择了这一学科,将这些学生信息输出

printf("请输入选择的科目名称:");
	char course1[20];
	scanf("%s", course1);
	if (strcmp(course1, "python") == 0)//选python时候
	{
		printf("姓名\t\t学号\t\t成绩\n");
		//创建指针从头开始查找
		studentNode* p = L->head;
		while (p->next)//当next=NULL时候不再循环
		{
			p = p->next;//每次循环都指向下一个储存空间
			if (p->stu.python != 0) //若这一科为零分 ,零分不输出,默认没选这一课
			{                              //输出学生的信息
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.python);
				printf("\n");
			}
		}
		printf("\n");
	}
	if (strcmp(course1, "C") == 0)//选C的时候
	{
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一节点指针指向头节点
		studentNode* p = L->head;
		//遍历链表输出
		while (p->next)
		{
			p = p->next;
			if (p->stu.C != 0) //若没选这一科则记为零分 ,零分不输出
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.C);
				printf("\n");
			}
		}
		printf("\n");

其他学科同样可以这个操作

find 函数:通过姓名查找学生信息

首先输入要查找的学生姓名,将其存入一个字符串中,然后将这个字符串与链表各结点中的姓名进行比较,找到相同名字之后,将这个节点内的其他信息一并输出,,,,按照学号查找学生信息思路相同。

void find(studentList* L)//通过姓名查找学生信息
{
	printf("请输入学生姓名:");
	char name[15];
	scanf("%s", name);
	studentNode* p = (*L->head).next;
	while (p) {
		//符合了就输出并结束函数
		if (strcmp(p->stu.name, name) == 0)
		{
			printf("姓名\t\t学号\t\tpython\t\tC\t\tjava\t\t总分\t\t平均分\n");
			printf("%s", p->stu.name);
			printf("\t\t%d", p->stu.number);
			printf("\t\t%d", p->stu.python);
			printf("\t\t%d", p->stu.C);
			printf("\t\t%d", p->stu.java);
			printf("\t\t%d", p->stu.sum);
			printf("\t\t%d", p->stu.average);
			printf("\n\n");
			return;//这句会结束函数返回主函数
		}
		//名字不符合就下一个
		p = p->next;
	}
	//最终没找到这个名字
	printf("没找到此人信息!\n\n");
}

display1:输出全部学生,在其他函数中被调用。直接将链表从头到尾所有结点的信息全部输出即可,主要注意输出格式问题

void display1(studentList* L)//输出全部学生成绩
 {
	printf("姓名\t\t学号\t\tpython\t\tC\t\tjava\t\t总分\t\t平均分\n");
	//创建指针指向头节点
	studentNode* p= L->head;
	while (p->next) {
		p = p->next;
		printf("%s", p->stu.name);
		printf("\t\t%d", p->stu.number);
		printf("\t\t%d", p->stu.python);
		printf("\t\t%d", p->stu.C);
		printf("\t\t%d", p->stu.java);
		printf("\t\t%d", p->stu.sum);
		printf("\t\t%d", p->stu.average);
		printf("\n");
	}
	printf("\n");
}

sort输出平均成绩排名:如果只有一个人,不需要排序直接调用display1函数输出即可;如果多人,则需要先根据平均成绩排名在调用display1函数输出,,输出某单科成绩排名思路大致相同?

void sort(studentList* L)//输出平均成绩排名的成绩单
{
	//少于两个节点不用排序
	if (L->count < 2)
	{
		display1(L);
		return;
	}
	//利用插入排序法进行排名
	studentNode* p, * pre, * tmp;
	//p指向第二个学生节点
	p = (*L->head).next;
	//链表从头节点和第一个学生节点处断开
	(*L->head).next = NULL;
	//从第一个学生节点开始一直往后循环
	while (p)
	{
		//存好下一个节点的指针
		tmp = p->next;
		//找到插入位置
		pre = L->head;
		while ((*pre).next != NULL && (*(*pre).next).stu.average > p->stu.average)
			pre = (*pre).next;
		//更新尾指针
		if ((*pre).next == NULL) {
			L->tail = p;
		}
		//插入
		p->next = (*pre).next;
		(*pre).next = p;
		//跳到下一个
		p = tmp;
	}
	display1(L);
}

modify函数:根据姓名修改学生成绩

先输入学生姓名,从链表头部一次向后匹配,直到遇到该姓名,到该姓名结点,对该节点的信息进行重新录入后,原内容自然会被覆盖,根据学号修改学生信息与此思路和结构相同

void modify(studentList* L)        //按照姓名修改学生成绩
{
	printf("请输入学生姓名:");
	char name[15];
	scanf("%s", name);
	studentNode* p = (*L->head).next;
	while (p) {
		if (strcmp(p->stu.name, name) == 0)//符合了就重新进行赋值
		{
			printf("请重新输入信息:\n");
			printf("请输入学生学号:");
			scanf("%d", &p->stu.number);
			printf("请输入python成绩:");
			scanf("%d", &p->stu.python);
			printf("请输入C成绩:");
			scanf("%d", &p->stu.C);
			printf("请输入java成绩:");
			scanf("%d", &p->stu.java);
			p->stu.sum = p->stu.python + p->stu.C + p->stu.java;
			p->stu.average = p->stu.sum / 3;
			printf("信息修改成功!\n\n");
			return;
		}
		//名字不符合就下一个
		p = p->next;
	}
	//遍历完里都没找到这个名字
	printf("没找到此人信息!\n\n", name);
}

最后通过读和写函数,讲链表中的信息存入到文件里,,,代码运行开始,从文件里读取信息到链表中,操作结束后,将链表的信息再写入文件中。

***注意需要建立一个名为? 成绩管理的txt文件,代码才能运行。

总代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FILE_NAME "成绩管理.txt"
typedef struct
{
	char name[15];
	int number;
	int python;
	int C;
	int java;
	int average;
	int sum;
} student;
typedef struct node
{
	student stu;
	struct node* next;	//指针域,指向下一个节点
} studentNode;			//学生节点
typedef struct
{
	studentNode* head;	//头指针
	studentNode* tail;	//尾指针
	int count;			//学生节点总数
} studentList;			//学生链表
void enter(studentList* L);		//输入成绩
void display(studentList* L);	//显示某科目学生
void display1(studentList* L);
void find(studentList* L);       //姓名查找某人
void find1(studentList* L);		//学号查找某人
void modify(studentList* L);	//靠名字修改
void modify1(studentList* L);	//靠学号修改
void sort(studentList* L);		//降序重新建表并输出
void sort1(studentList* L);        //对某科排序
void write(studentList* L);		//写入文件,边写边释放空间
void read(studentList* L);		//读取文件,边读边建表
int main() {

	printf("		**************学生成绩管理系统**************\n");
	printf("		*  1.录入新的学生成绩                      *\n");//ok,但无课程编号
	printf("		*  2.按姓名修改学生成绩                    *\n");//ok
	printf("		*  3.按学号修改学生成绩                    *\n");//ok
	printf("		*  4.按姓名查询学生成绩                    *\n");//ok
	printf("		*  5.按学号查询学生成绩                    *\n");//ok
	printf("		*  6.查询某科目的选课学生信息              *\n");//ok
	printf("		*  7.输出某科目的学生成绩排名              *\n");
	printf("		*  8.按平均分输出学生成绩                  *\n");//ok
	printf("		*  9.退出学生成绩管理系统                  *\n");//ok
	printf("		********************************************\n");
	printf("  	                                                \n");
	//创建学生链表
	studentList* L = (studentList*)malloc(sizeof(studentList));
	//初始化学生链表
	studentNode* s = (studentNode*)malloc(sizeof(studentNode));//*s为开辟空间的头,无学生数据
	s->next = NULL;
	//初始化链表:
	//头尾指针均指向头节点,初始长度为零
	L->head = s;
	L->tail = s;
	L->count= 0;
	//从文件里读取数据到链表
	read(L);
	while (1) {
		int code;
		printf("请输入你想进行的操作对应的数字: ");
		scanf("%d", &code);
			if (code == 1)
				enter(L);
			else if (code == 2)
				modify(L);
			else if (code == 3)
				modify1(L);
			else if (code == 4)
				find(L);
			else if (code == 5)
				find1(L);
			else if (code == 6)
				display(L);
			else if (code == 7)
				sort1(L);
			else if (code == 8)
				sort(L);
			else if (code == 9)
			{
				write(L);
				free(L->head);	//头节点被销毁
				free(L);		//链表被销毁
				return 0;
			}
			else
				printf("%d是无效的数字,请重新输入!\n\n", code);
	}
	return 0;
}
///
void enter(studentList* L)录入学生成绩
{
	//创建新空间
	studentNode* s = (studentNode*)malloc(sizeof(studentNode));
	//对这个空间的量进行赋值
	printf("请输入学生姓名:");
	scanf("%s",s->stu.name);
	printf("请输入学生学号:");
	scanf("%d", &s->stu.number);
	printf("请输入python成绩:");
	scanf("%d", &s->stu.python);
	printf("请输入C成绩:");
	scanf("%d", &s->stu.C);
	printf("请输入java成绩:");
	scanf("%d", &s->stu.java);
	(*s).stu.sum = s->stu.python + s->stu.C + s->stu.java;
	s->stu.average = s->stu.sum / 3;
	//若链表为空,将尾指针指向这个储存空间
	if (L->head == L->tail) {
		L->tail = s;
	}
	//将这个储存空间插进链表(放在head后面)
	s->next = L->head->next;
	L->head->next = s;
	L->count++;
	//功能完成
	printf("信息录入成功!\n\n");
}
///
void display(studentList* L)//输出选择某科目的学生,未排名
{
	printf("请输入选择的科目名称:");
	char course1[20];
	scanf("%s", course1);
	if (strcmp(course1, "python") == 0)//选python时候
	{
		printf("姓名\t\t学号\t\t成绩\n");
		//创建指针从头开始查找
		studentNode* p = L->head;
		while (p->next)//当next=NULL时候不再循环
		{
			p = p->next;//每次循环都指向下一个储存空间
			if (p->stu.python != 0) //若这一科为零分 ,零分不输出,默认没选这一课
			{                              //输出学生的信息
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.python);
				printf("\n");
			}
		}
		printf("\n");
	}
	if (strcmp(course1, "C") == 0)//选C的时候
	{
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一节点指针指向头节点
		studentNode* p = L->head;
		//遍历链表输出
		while (p->next)
		{
			p = p->next;
			if (p->stu.C != 0) //若没选这一科则记为零分 ,零分不输出
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.C);
				printf("\n");
			}
		}
		printf("\n");
	}
	if (strcmp(course1, "java") == 0)//选java时候
	{
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一指针指向头节点
		studentNode* p = L->head;
		while (p->next)
		{
			p = p->next;
			if (p->stu.java != 0)
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.java);
				printf("\n");
			}
		}
		printf("\n");
	}
}

/查找某个学生
void find(studentList* L)//通过姓名查找学生信息
{
	printf("请输入学生姓名:");
	char name[15];
	scanf("%s", name);
	studentNode* p = (*L->head).next;
	while (p) {
		//符合了就输出并结束函数
		if (strcmp(p->stu.name, name) == 0)
		{
			printf("姓名\t\t学号\t\tpython\t\tC\t\tjava\t\t总分\t\t平均分\n");
			printf("%s", p->stu.name);
			printf("\t\t%d", p->stu.number);
			printf("\t\t%d", p->stu.python);
			printf("\t\t%d", p->stu.C);
			printf("\t\t%d", p->stu.java);
			printf("\t\t%d", p->stu.sum);
			printf("\t\t%d", p->stu.average);
			printf("\n\n");
			return;//这句会结束函数返回主函数
		}
		//名字不符合就下一个
		p = p->next;
	}
	//最终没找到这个名字
	printf("没找到此人信息!\n\n");
}
///
void find1(studentList* L)//通过学号查找学生信息
{
	printf("请输入学生学号:");
	int number;
	scanf("%d", &number);
	//创建个指针,从第二个开始查找
	studentNode* p = (*L->head).next;
	while (p) {
		//符合了就输出并结束函数
		if (p->stu.number == number)
		{
			printf("姓名\t\t学号\t\tpython\t\tC\t\tjava\t\t总分\t\t平均分\n");
			printf("%s", p->stu.name);
			printf("\t\t%d", p->stu.number);
			printf("\t\t%d", p->stu.python);
			printf("\t\t%d", p->stu.C);
			printf("\t\t%d", p->stu.java);
			printf("\t\t%d", p->stu.sum);
			printf("\t\t%d", p->stu.average);
			printf("\n\n");
			return;
		}
		//学号不符合就下一个
		p = p->next;
	}
	//遍历完里都没找到这个学号
	printf("没找到此人!\n\n");
}
/// 
void display1(studentList* L)//输出全部学生成绩
 {
	printf("姓名\t\t学号\t\tpython\t\tC\t\tjava\t\t总分\t\t平均分\n");
	//创建指针指向头节点
	studentNode* p= L->head;
	while (p->next) {
		p = p->next;
		printf("%s", p->stu.name);
		printf("\t\t%d", p->stu.number);
		printf("\t\t%d", p->stu.python);
		printf("\t\t%d", p->stu.C);
		printf("\t\t%d", p->stu.java);
		printf("\t\t%d", p->stu.sum);
		printf("\t\t%d", p->stu.average);
		printf("\n");
	}
	printf("\n");
}
///
void sort(studentList* L)//输出平均成绩排名的成绩单
{
	//少于两个节点不用排序
	if (L->count < 2)
	{
		display1(L);
		return;
	}
	//利用插入排序法进行排名
	studentNode* p, * pre, * tmp;
	//p指向第二个学生节点
	p = (*L->head).next;
	//链表从头节点和第一个学生节点处断开
	(*L->head).next = NULL;
	//从第一个学生节点开始一直往后循环
	while (p)
	{
		//存好下一个节点的指针
		tmp = p->next;
		//找到插入位置
		pre = L->head;
		while ((*pre).next != NULL && (*(*pre).next).stu.average > p->stu.average)
			pre = (*pre).next;
		//更新尾指针
		if ((*pre).next == NULL) {
			L->tail = p;
		}
		//插入
		p->next = (*pre).next;
		(*pre).next = p;
		//跳到下一个
		p = tmp;
	}
	display1(L);
}
///
void sort1(studentList* L)//输出某科目学生成绩排名
{
	printf("请输入选择的科目名称:");
	char course1[20];
	scanf("%s", course1);
	if (strcmp(course1, "python") == 0)
	{
		//插入排序法 ,排名开始
		studentNode* p, * pre, * tmp;
		//p指向第二个学生节点
		p = (*L->head).next;
		//链表从头节点和第一个学生节点处断开
		(*L->head).next = NULL;
		//从第一个学生节点开始一直往后循环
		while (p)
		{
			//存好下一个节点的指针
			tmp = p->next;
			//找到插入位置
			pre = L->head;
			while ((*pre).next != NULL && (*(*pre).next).stu.python > p->stu.python)
				pre = (*pre).next;
			//更新尾指针
			if ((*pre).next == NULL) {
				L->tail = p;
			}
			//插入
			p->next = (*pre).next;
			(*pre).next = p;
			//跳到下一个
			p = tmp;
		}//到这排名结束
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一节点指针指向头节点
		p = L->head;
		//遍历链表输出
		while (p->next)
		{
			p = p->next;
			if (p->stu.python != 0) //若没选这一科则记为零分 ,零分不输出
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.python);
				printf("\n");
			}
		}
		printf("\n");
	}
	if (strcmp(course1, "C") == 0)
	{
		//插入排序
		studentNode* p, * pre, * tmp;
		//p指向第二个学生节点
		p = (*L->head).next;
		//链表从头节点和第一个学生节点处断开
		(*L->head).next = NULL;
		//从第一个学生节点开始一直往后循环
		while (p)
		{
			//存好下一个节点的指针
			tmp = p->next;
			//找到插入位置
			pre = L->head;
			while ((*pre).next != NULL && (*(*pre).next).stu.C > p->stu.C)
				pre = (*pre).next;
			//更新尾指针
			if ((*pre).next == NULL) {
				L->tail = p;
			}
			//插入
			p->next = (*pre).next;
			(*pre).next = p;
			//跳到下一个
			p = tmp;
		}
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一节点指针指向头节点
		p = L->head;
		//遍历链表输出
		while (p->next)
		{
			p = p->next;
			if (p->stu.C != 0) //若没选这一科则记为零分 ,零分不输出
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.C);
				printf("\n");
			}
		}
		printf("\n");
	}
	if (strcmp(course1, "java") == 0)
	{
		//插入排序
		studentNode* p, * pre, * tmp;
		//p指向第二个学生节点
		p = (*L->head).next;
		//链表从头节点和第一个学生节点处断开
		(*L->head).next = NULL;
		//从第一个学生节点开始一直往后循环
		while (p)
		{
			//存好下一个节点的指针
			tmp = p->next;
			//找到插入位置
			pre = L->head;
			while ((*pre).next != NULL && (*(*pre).next).stu.java > p->stu.java)
				pre = (*pre).next;
			//更新尾指针
			if ((*pre).next == NULL) {
				L->tail = p;
			}
			//插入
			p->next = (*pre).next;
			(*pre).next = p;
			//跳到下一个
			p = tmp;
		}
		printf("姓名\t\t学号\t\t成绩\n");
		//创建一节点指针指向头节点
		p = L->head;
		//遍历链表输出
		while (p->next)
		{
			p = p->next;
			if (p->stu.java != 0) //若没选这一科则记为零分 ,零分不输出
			{
				printf("%s", p->stu.name);
				printf("\t\t%d", p->stu.number);
				printf("\t\t%d", p->stu.java);
				printf("\n");
			}
		}
		printf("\n");
	}

}
//
void modify(studentList* L)        //按照姓名修改学生成绩
{
	printf("请输入学生姓名:");
	char name[15];
	scanf("%s", name);
	studentNode* p = (*L->head).next;
	while (p) {
		if (strcmp(p->stu.name, name) == 0)//符合了就重新进行赋值
		{
			printf("请重新输入信息:\n");
			printf("请输入学生学号:");
			scanf("%d", &p->stu.number);
			printf("请输入python成绩:");
			scanf("%d", &p->stu.python);
			printf("请输入C成绩:");
			scanf("%d", &p->stu.C);
			printf("请输入java成绩:");
			scanf("%d", &p->stu.java);
			p->stu.sum = p->stu.python + p->stu.C + p->stu.java;
			p->stu.average = p->stu.sum / 3;
			printf("信息修改成功!\n\n");
			return;
		}
		//名字不符合就下一个
		p = p->next;
	}
	//遍历完里都没找到这个名字
	printf("没找到此人信息!\n\n", name);
}
///
void modify1(studentList* L)        //按照学号修改学生成绩
{
	printf("请输入学生学号:");
	int number;
	scanf("%d", &number);
	//遍历链表对比学号
	studentNode* p = (*L->head).next;
	while (p) {
		//符合了就让用户重新赋值
		if (p->stu.number == number)
		{
			printf("请重新输入信息:\n");
			printf("请输入学生姓名:");
			scanf("%s", p->stu.name);
			printf("请输入python成绩:");
			scanf("%d", &p->stu.python);
			printf("请输入C成绩:");
			scanf("%d", &p->stu.C);
			printf("请输入java成绩:");
			scanf("%d", &p->stu.java);
			p->stu.sum = p->stu.python + p->stu.C + p->stu.java;
			p->stu.average = p->stu.sum / 3;
			printf("信息修改成功!\n\n");
			return;
		}
		//学号不符合就下一个
		p = p->next;
	}
	//遍历完里都没找到这个学号
	printf("没找到此人的信息!\n\n");
}

void write(studentList* L)//把链表数据输入文件
{
	//打开文件
	FILE* fp = fopen(FILE_NAME, "w");
	if (fp == NULL)
	{
		printf("文件打开失败\n");
		exit(0);//结束所有程序
	}
	//将学生节点总数输出在第一行
	fprintf(fp, "%d\n", L->count);
	//创建一节点指针指向头节点
	studentNode* p;
	p = (*L->head).next;
	while (p) {
		fprintf(fp, "%s ", p->stu.name);
		fprintf(fp, "%d ", p->stu.number);
		fprintf(fp, "%d ", p->stu.python);
		fprintf(fp, "%d ", p->stu.C);
		fprintf(fp, "%d ", p->stu.java);
		fprintf(fp, "%d ", p->stu.sum);
		fprintf(fp, "%d ", p->stu.average);
		fprintf(fp, "\n");
		//输出完成之后释放节点空间
		studentNode* next = p->next;
		free(p);
		p = next;//p指向下一个储存空间
	}
	//关闭文件
	fclose(fp);
	printf("数据已保存!谢谢使用,再见!\n");
}
///
void read(studentList* L)//从文件中读取数据到链表
{
	FILE* fp = fopen(FILE_NAME, "r");
	if (fp == NULL) {
		printf("文件打开失败\n");
		exit(0);//结束程序
	}
	//读取第一行的学生节点总数
	fscanf(fp, "%d", &L->count);
	//循环读取数据,循环次数为count
	for (int i = 1; i <= L->  count; i++)
	{
		//创建新节点
		studentNode* s = (studentNode*)malloc(sizeof(studentNode));
		//读取数据
		fscanf(fp, "%s ", s->stu.name);
		fscanf(fp, "%d ", &s->stu.number);
		fscanf(fp, "%d ", &s->stu.python);
		fscanf(fp, "%d ", &s->stu.C);
		fscanf(fp, "%d ", &s->stu.java);
		fscanf(fp, "%d ", &s->stu.sum);
		fscanf(fp, "%d ", &s->stu.average);
		//将新节点插进链表尾部
		s->next = NULL;
		L->tail->next = s;//L->tail指的是插入前链表的最后一个结点,是这个结点的next指向了插入的结点
		L->tail = s;
	}
	//关闭文件
	fclose(fp);
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-07-21 21:45:58  更:2022-07-21 21:47:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:47:27-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码