数据结构7/23—链表实现简单的学生信息管理系统

2023-11-15

目录

定义结构体存储学生信息(姓名 成绩):

功能实现,各种功能函数如下↓

菜单函数:

创建链表函数

判断是否为空的判空函数

插入函数(头插方式实现)

遍历链表函数

排序输出(升序)

输出最高分学生信息

以名字查找该学生的前驱节点

通过名字删除学生信息

按照名字查找学生信息并输出信息

按姓名修改学生信息

全部代码

linklist.h

linklist.c

main.c


定义结构体存储学生信息(姓名 成绩):

typedef char datatype;

typedef struct student
{
	char name[20];
	int score;
}stu;

typedef struct Node
{
	union{
		stu data;//数据域
		int len;
	};
	struct Node *next;//指针域
}Linklist;

功能实现,各种功能函数如下↓

菜单函数:

//菜单
void menu()
{
	printf("\t********学生信息管理系统********\n");
	printf("\t\t1.插入学生信息\n");
	printf("\t\t2.遍历学生信息\n");
	printf("\t\t3.通过姓名删除\n");
	printf("\t\t4.通过姓名修改\n");
	printf("\t\t5.排序输出信息\n");
	printf("\t\t6.输出成绩最高\n");
	printf("\t\t7.查找学生信息\n");
	printf("\t\t8.退出程序\n");
}

创建链表函数

//创建
Linklist *list_create()
{
	Linklist *L=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}//初始化
	L->len =0;
	L->next=NULL;
	printf("创建成功\n");
	return L;
}

判断是否为空的判空函数

//判空
int list_empty(Linklist *L)
{
	return NULL==L->next ?1:0;//1表示空 0表示非空
}

插入函数(头插方式实现)

//头插
int list_insert_head(Linklist *L,char name[],int score)
{
	//判断条件
	if (NULL==L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	//申请节点
	Linklist *p=(Linklist *)malloc(sizeof(Linklist));
	if(NULL==p)
	{
		printf("节点申请失败\n");
		return -1;
	}
	//插入数据
	strcpy(p->data.name,name);
	p->data.score=score;
	p->next=NULL;
	//完成头插
	p->next = L->next;
	L->next = p;
	//表的变化
	L->len++;
}

遍历链表函数

//遍历
void list_show(Linklist *L)
{
	//判断逻辑
	if (NULL==L || list_empty(L))
	{
		printf("表空 遍历失败\n");
	}
	//遍历逻辑
	printf("\n\t学生信息为:\n\t**************\n\t姓名\t分数\n");
	Linklist *q= L->next;
	while (q!=NULL)
	{
		printf("\t%s",q->data.name);
		printf("\t%d\t",q->data.score);
		q=q->next;
		printf("\n");
	}
	printf("\n");
}

排序输出(升序)

//排序输出
void sort(Linklist *L)
{
	Linklist *t=(Linklist *)malloc(sizeof(Linklist));
	t->next=NULL;
	for(int i=1;i<L->len;i++)
	{
		Linklist *q=L->next;
		Linklist *p=q->next;
		for(int j=0;j<L->len-i;j++)
		{
			if (q->data.score>p->data.score)
			{
				t->data=q->data;q->data=p->data;p->data=t->data;
			}
			q=q->next;
			p=p->next;
		}
	}
	free(t);
	t=NULL;

}

输出最高分学生信息

//查找分数最高学生信息
int max(Linklist *L)
{
	Linklist *q=L->next;
	Linklist *p=(Linklist*)malloc(sizeof(Linklist));
	strcpy(p->data.name,"");
	p->data.score=0;
	p->next=NULL;
	for(int i=1;i<=L->len;i++)
	{
		if(q->data.score>p->data.score)
		{
			p->data=q->data;
		}q=q->next;
	}printf("%s\t%d\n",p->data.name,p->data.score);
	return 1;
}

以名字查找该学生的前驱节点

//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[])
{//判断逻辑
	if (NULL==L )
	{
		printf("查找失败\n");
		return NULL;
	}
	//查找节点
	Linklist *q=L;
	for (int i=1; i<=L->len; i++)
	{
		if ((strcmp(q->next->data.name,name))==0)
		{
			break;
		}
		q=q->next;
	}
	return q;//将找到的节点返回
}

通过名字删除学生信息

//按名字删
int list_delete_name(Linklist *L,char name[])
{
	//判断逻辑
	if (NULL==L|| list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
	//找到要删除位置的前驱
	Linklist *q=find_node(L,name);
	//删除逻辑
	Linklist *p=q->next;
	q->next=p->next;
	//释放空间
	free(p);
	p=NULL;
	//表的变化
	L->len--;
}

按照名字查找学生信息并输出信息

//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name)
{
	if (NULL==L || list_empty(L))
	{
		//printf("查找失败\n");
		return -1;
	}
	//查找逻辑
	Linklist *q=L->next;
	for (int i=1; i<=L->len; i++)
	{
		if (strcmp(q->data.name,name)==0)
		{
			printf("\t%s\t%d\n",q->data.name,q->data.score);
			return i;//返回学生位置
		}
		q=q->next;
	}
	return 0;
}

按姓名修改学生信息

//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score)
{
	Linklist *p=L;	
	while(p->next!=NULL)
	{ 	
		p=p->next;
		if(strcmp(p->data.name,name)==0)
		{
			strcpy(p->data.name,new_name);
			p->data.score=new_score;
			printf("修改成功\n");
			return 1;
		}
	}printf("未找到\n");
	return -1;
}

全部代码

linklist.h

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
typedef char datatype;

typedef struct student
{
	char name[20];
	int score;
}stu;

typedef struct Node
{
	union{
		stu data;//数据域
		int len;
	};
	struct Node *next;//指针域
}Linklist;
//菜单
void menu();
//创建
Linklist *list_create();
//判空
int list_empty(Linklist *L);
//头插
int list_insert_head(Linklist *L,char name[],int score);
//遍历
void list_show(Linklist *L);
//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[]);
//按名字删
int list_delete_name(Linklist *L,char name[]);
//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name);
//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score);
//排序输出
void sort(Linklist *L);
//查找分数最高学生信息
int max(Linklist *L);


#endif

linklist.c

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"linklist.h"
//菜单
void menu()
{
	printf("\t********学生信息管理系统********\n");
	printf("\t\t1.插入学生信息\n");
	printf("\t\t2.遍历学生信息\n");
	printf("\t\t3.通过姓名删除\n");
	printf("\t\t4.通过姓名修改\n");
	printf("\t\t5.排序输出信息\n");
	printf("\t\t6.输出成绩最高\n");
	printf("\t\t7.查找学生信息\n");
	printf("\t\t8.退出程序\n");
}
//创建
Linklist *list_create()
{
	Linklist *L=(Linklist*)malloc(sizeof(Linklist));
	if(NULL==L)
	{
		printf("创建失败\n");
		return NULL;
	}//初始化
	L->len =0;
	L->next=NULL;
	printf("创建成功\n");
	return L;
}
//判空
int list_empty(Linklist *L)
{
	return NULL==L->next ?1:0;//1表示空 0表示非空
}
//头插
int list_insert_head(Linklist *L,char name[],int score)
{
	//判断条件
	if (NULL==L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	//申请节点
	Linklist *p=(Linklist *)malloc(sizeof(Linklist));
	if(NULL==p)
	{
		printf("节点申请失败\n");
		return -1;
	}
	//插入数据
	strcpy(p->data.name,name);
	p->data.score=score;
	p->next=NULL;
	//完成头插
	p->next = L->next;
	L->next = p;
	//表的变化
	L->len++;
//rintf("头插成功\n");
}

//遍历
void list_show(Linklist *L)
{
	//判断逻辑
	if (NULL==L || list_empty(L))
	{
		printf("表空 遍历失败\n");
	}
	//遍历逻辑
	printf("\n\t学生信息为:\n\t**************\n\t姓名\t分数\n");
	Linklist *q= L->next;
	while (q!=NULL)
	{
		printf("\t%s",q->data.name);
		printf("\t%d\t",q->data.score);
		q=q->next;
		printf("\n");
	}
	printf("\n");
}
//排序输出
void sort(Linklist *L)
{
	Linklist *q=L->next;
	Linklist *p=q->next;
	Linklist *t=(Linklist *)malloc(sizeof(Linklist));
	t->next=NULL;
	for(q;q!=NULL;q=q->next)
	{
		for(p;p!=NULL;p=p->next)
		{
			if (q->data.score>p->data.score)
			{
				t->data=q->data;q->data=p->data;p->data=t->data;
				break;
			}
		}
	}
	free(t);
	t=NULL;

}
//查找分数最高学生信息
int max(Linklist *L)
{
	Linklist *q=L->next;
	Linklist *p=(Linklist*)malloc(sizeof(Linklist));
	strcpy(p->data.name,"");
	p->data.score=0;
	p->next=NULL;
	for(int i=1;i<=L->len;i++)
	{
		if(q->data.score>p->data.score)
		{
			p->data=q->data;
		}q=q->next;
	}printf("%s\t%d\n",p->data.name,p->data.score);
	return 1;
}

//按名字查找返回查找名字的前驱节点
Linklist *find_node(Linklist *L,char name[])
{//判断逻辑
	if (NULL==L )
	{
		printf("查找失败\n");
		return NULL;
	}
	//查找节点
	Linklist *q=L;
	for (int i=1; i<=L->len; i++)
	{
		if ((strcmp(q->next->data.name,name))==0)
		{
			break;
		}
		q=q->next;
	}
	return q;//将找到的节点返回
}

//按名字删
int list_delete_name(Linklist *L,char name[])
{
	//判断逻辑
	if (NULL==L|| list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}
	//找到要删除位置的前驱
	Linklist *q=find_node(L,name);
	//删除逻辑
	Linklist *p=q->next;
	q->next=p->next;
	//释放空间
	free(p);
	p=NULL;
	//表的变化
	L->len--;
}

//按名字查找学生信息并输出
int list_search_value(Linklist *L,char *name)
{
	if (NULL==L || list_empty(L))
	{
		//printf("查找失败\n");
		return -1;
	}
	//查找逻辑
	Linklist *q=L->next;
	for (int i=1; i<=L->len; i++)
	{
		if (strcmp(q->data.name,name)==0)
		{
			printf("\t%s\t%d\n",q->data.name,q->data.score);
			return i;//返回学生位置
		}
		q=q->next;
	}
	return 0;
}
//按姓名修改信息函数
int list_update_value(Linklist *L,char name[],char new_name[],int new_score)
{
	Linklist *p=L;	
	while(p->next!=NULL)
	{ 	
		p=p->next;
		if(strcmp(p->data.name,name)==0)
		{
			strcpy(p->data.name,new_name);
			p->data.score=new_score;
			printf("修改成功\n");
			return 1;
		}
	}printf("未找到\n");
	return -1;
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"linklist.h"
int main(int argc, const char *argv[])
{
	Linklist *L=list_create();
	if (NULL==L)
	{
		return -1;
	}
	menu();
	int num,n,score;//功能编号和学生个数 分数
	char name[20];
	for (;;)
	{
		printf("请选择功能:");
		scanf("%d",&num); 			//功能编号
		switch(num)
		{
		case 1:
			{
				printf("请输入需要输入的学生个数:");
				scanf("%d",&n);
				for (int i=0; i<n; i++)
				{
					printf("请输入学生姓名:");
					scanf("%s",name);
					printf("请输入学生的分数:");
					scanf("%d",&score);
					list_insert_head(L,name,score);
				}
				list_show(L);
			}break;
		case 2:
			{
				list_show(L);
			}break;
		case 3:
			{
				printf("请输入要删除的学生姓名:");
				scanf("%s",name);
				list_delete_name(L,name);		
				list_show(L);
			}break;
		case 4:
			{
				char new_name[20];int new_score;  //定义新的学生姓名和分数
				printf("请输入需要修改信息的学生姓名:");
				scanf("%s",name);
				printf("请输入新的学生姓名:");
				scanf("%s",new_name);
				printf("请输入新的学生分数:");
				scanf("%d",&new_score);
				list_update_value(L,name,new_name,new_score);
				list_show(L);
			}break;
		case 5:
			{
				sort(L);
				list_show(L);
			}break;
		case 6:
			{
				max(L);	
			}break;
		case 7:
			{
				printf("请输入需要查找信息的学生姓名:");
				scanf("%s",name);
				
				list_search_value(L,name);
			}break;
		case 8:
			{
				exit(0);	
			}break;
		default:printf("输入不合法\n");
		}

	}
	return 0;
}

这就是一个简单学生管理系统仅供大家参考,欢迎大家修改完善使用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构7/23—链表实现简单的学生信息管理系统 的相关文章

  • 在 Ubuntu 上运行独立的 ASP.NET Core 应用程序

    我已经发布了一个 ASP NET Core 应用程序作为针对 Ubuntu 的独立应用程序 发布似乎工作正常 我已将这些文件复制到一台漂亮的 Ubuntu 机器上 现在 我如何运行我的应用程序 我的理解是 因为它是一个独立的 NET Cor
  • 无法在 docker 容器内安装 vim 或 nano

    尝试在 docker vim 或 nano 内安装 但我只得到这个 0 Connecting to archive ubuntu com 91 189 88 152 退出 docker 并执行ping archive ubuntu com我
  • 使用mongodb+srv配置Mongo

    我在 docker 上启动 mongo 所以默认主机 localhost port 27017 用户名 root密码 example 现在我想通过连接字符串进行连接 mongodb srv root example localhost si
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • 如何从最新版本的 Ubuntu (18.10) 运行使用 SystemD 的 Docker 容器?

    我正在尝试执行使用 ubuntu latest 构建的 Docker 映像 并且在运行容器时不断收到 SystemD 错误消息 System has not been booted with systemd as init system P
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • Docker 中的 Airflow:如何将 DAG 添加到 Airflow?

    我想将 DAG 文件添加到 Airflow 它在 Ubuntu 上的 Docker 中运行 我用了以下git 存储库 https github com puckel docker airflow 包含配置和 docker 镜像的链接 当我跑
  • apt-get install tzdata 非交互式

    当我尝试 apt get install y tzdata 将显示用于选择时区的命令行选项 我试图在脚本中使用它来进行一些设置 如何在没有用户输入的情况下使 apt get 运行 我知道重新配置 tzdata 我可以做 echo Ameri
  • 操作错误:尝试在 ubuntu 服务器中写入只读数据库

    我正在使用 FlaskApp 运行mod wsgi and apache2在 Ubuntu 服务器上 我尝试运行烧瓶应用程序localhost成功 然后部署到ubuntu服务器上 但是当我尝试更新数据库时 出现错误 Failed to up
  • Ubuntu 12.04 上的 DeepDive 安装指南

    在拥有以后很多问题 https stackoverflow com questions 22469188 deepdive installation postgresql error安装深潜项目 http deepdive stanford
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • 如何在不反编译的情况下更改已编译的.class文件?

    我想更改 class 文件方法 我安装 JD Eclipse Decompiler 并打开 class 文件 我添加了一些代码并保存 class 文件 但是 class 文件没有改变 我不知道如何使用反编译器 如果可能的话 如何在不使用反编
  • apt-get 无法在 ubuntu dockerfile 中工作

    我对 docker 相当陌生 正在尝试通过编写自己的镜像来学习 并且目前正在阅读 Docker 的实际操作 ISBN 1633430235 在我自己的代码和书中的示例 第 146 页 中 我想通过 dockerfile 安装 git My
  • 如何在ubuntu的conda环境中更改Rstudio中的R版本

    我在基本系统中安装了 R 4 3 和 Rstudio 在 conda 环境中安装了旧版本的 R 4 2 3 命令which R返回环境中安装的 R 的目录 home 用户 miniconda3 envs anndata2ri pip bin
  • pip:需要将包名称tensorflow-gpu更改为tensorflow

    我正在尝试将具有 GPU 支持的张量流安装到 conda 环境中 我使用命令 pip install ignore installed upgrade https storage googleapis com tensorflow linu
  • 让 Rails 生产在端口 80 上运行

    我正在尝试让我的 Rails 应用程序在生产模式下运行 但遇到了一些困难 我正在使用 Passenger 和 apache 并运行 Ubuntu 12 04 我已经配置和创建了生产数据库 并设置了乘客 状态如下 rvmsudo passen
  • 如何授予 apache 使用 NTFS 分区上的目录的权限?

    我在一台带有 20GB 硬盘的旧机器上运行 Linux Lubutu 12 10 我有一个 1 TB 外部硬盘 上面有一个 NTFS 分区 在该分区上 有一个 www 目录 用于保存我的网页内容 它在启动时自动安装为 media t515
  • 没有名为“PIL”的模块

    当我尝试时遇到错误 from PIL import Image ImageFilter 在 Python 文件中我收到一条错误消息ModuleNotFoundError No module named PIL 到目前为止 我已经尝试卸载 重
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索

随机推荐

  • 利用Canal把MySQL数据同步到ES

    Canal是阿里巴巴开源的一个数据库变更数据同步工具 主要用于 MySQL 数据库的增量数据到下游的同步 例如同步到 Elasticsearch HBase Hive 等 下面是一个基本的步骤来导入 MySQL 数据库到 Elasticse
  • LLVM在Windows下使用VisualStudio2017添加编译自定义pass

    参考 uu kk LLVM pass on Windows integrating with opt 该方法仍然有效 只不过还需要一些修改 遇到的错误需要解决 错误1 CMake Error at CMakeLists txt 658 me
  • win10安装mysql的步骤_win10 安装mysql 8.0.18-winx64的步骤详解

    1 先去官网下载mysql 安装包 https dev mysql com downloads mysql 2 下载完后解压到你想要安装MSQ 的文件目录下 如 D Mysql 3 管理员命令运行 命令行 进入mysql 安装包的 bin
  • 语义分割 - Semantic Segmentation Papers

    语义分割类的论文与代码汇总 逐渐迁移到搭建的博客上 AIUAI www aiuai cn 新地址 语义分割 Semantic Segmentation Papers AIUAI Semantic Segmentation Convoluti
  • Accuracy index of object detection: F1 & IoU

    Reference https stats stackexchange com questions 273537 f1 dice score vs iou https www pyimagesearch com 2016 11 07 int
  • qemu-linux-user ELF vs XCOFF 2

    最后更新2021 12 16 qemu 4 x linux user mmap c 里target mmap如果offset不是aligned有问题 前面检测后直接退出了 后面做了pread 但走不到这个地方 修改一下 看看效果如何 如前所
  • 在 GitHub 公开源码,造成百万损失,大疆程序员被判 6 个月,罚款 20 万

    给程序员的那些事加星标 原创整理 程序员的那些事 id iProgrammer 4 月 22 日 某站源码在 GitHub 突然被开源 虽然 GitHub 站方出面封掉了首个暴露的代码库 但后续还是有很多人继续主动在 GitHub 新建代码
  • 黑马SpringBoot 基础篇12-28

    1 复制模块 简单来说 别人的工程 你想用 需要修改一些东西 才能用 按照以下步骤即可 基础篇 属性配置方式 springboot默认配置文件是application properties 在里面直接修改就行 格式为key value 修改
  • oracle创建用户,授权和导入.dmp数据

    1 打开cmd 输入sqlplus 回车 2 输入用户名 system manager orcl as sysdba 回车 3 create user muzai identified by muzai 创建muzai用户 密码为muzai
  • 进阶之路(中级篇) - 018 基于arduino的简易版智能衣架

    一 设备及要求 目的 制作一个可以自动根据事实的天气的状况进行对衣架上的衣服进行晾晒 基础装置 可伸缩的晾衣架 开发环境 Arduino1 8 1 主控板 Arduino UNO 动力装置 二相四线步进电机 电机控制板 供电设备 5V 50
  • unity Physics.xxxCast射线检测结果有错误

    在project setting中有个Auto Sync Transform选项 在2018 2以前的版本里是默认为true的 在之后版本默认为false 如果禁用AutoSyncTransforms 移动碰撞体 然后调用光线投射 使光线的
  • 报 java.lang.NoClassDefFoundError: org/springframework/beans/factory/BeanFactory错误!

    报 java lang NoClassDefFoundError org springframework beans factory BeanFactory错误 和java lang ClassNotFoundException org s
  • 【数据结构与算法】6、栈(Stack)的实现、LeetCode:有效的括号

    目录 一 栈 Stack 二 利用 ArrayList 实现栈 三 LeetCode 有效的括号 1 思路 2 代码 看完思路后自己实现的代码 老师的代码 利用 HashMap 简化代码 一 栈 Stack 栈是一种特殊的线性表 只能在一端
  • Windows Cygwin 配置

    Windows Cygwin 配置 一 什么是Cygwin Cygwin 原Cygnus出品 已被红帽收购 目前是RedHat名下的项目 项目的目的是提供运行于 Windows 平台的类 Unix 环境 以 GNU 工具为代表 为了达到这个
  • VAE(变分自编码器) 详解

    近期看论文要用到VAE 看了很多资料 有这样一种感觉 要么过度过于偏向数学原理 要么只是讲了讲网络结构 本文将两者结合 以简洁易懂的语言结合代码实现来介绍VAE 1 解决问题 VAE是变分推断 variational inference 以
  • JFugue: 开源编程音乐Java API

    编译及执行以下代码 将从扬声器播放音乐 C Users lenovo Desktop gt javac classpath jfugue 4 0 3 jar testxyz javaC Users lenovo Desktop gt jav
  • java调用kettle例子_数据仓库开发——Kettle使用示例

    Kettle是一个开园ETL工具 做数据仓库用Spoon 工具 下载Spoon 解压即可用 1 认识常用组件 表输入 插入 更新 数据同步 文本文件输出 更新 自动文档输出 表输出 列转行 增加常量 增加序列 排序记录 行转列 过滤记录 数
  • mkdocs

    mkdocs简单使用 官网 一 安装 查看 python 版本 python version Python 2 7 2 查看 pip 版本 pip version pip 1 5 2 更新 pip pip install upgrade p
  • ubuntu 安装rtorrent 下载

    apt get install rtorrent 在根目录下 建立 rtorrent rc 最小允许peer数 min peers 3 最大允许peer数 max peers 500 最大同时上传用户数 max uploads 10 最大下
  • 数据结构7/23—链表实现简单的学生信息管理系统

    目录 定义结构体存储学生信息 姓名 成绩 功能实现 各种功能函数如下 菜单函数 创建链表函数 判断是否为空的判空函数 插入函数 头插方式实现 遍历链表函数 排序输出 升序 输出最高分学生信息 以名字查找该学生的前驱节点 通过名字删除学生信息