用单链表实现学生信息管理系统(7.23周末作业)

这篇具有很好参考价值的文章主要介绍了用单链表实现学生信息管理系统(7.23周末作业)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

结构体定义:

typedef struct Student
{
	char name[20];
	int id;
	float score;
}datatype;

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

功能函数:

1.申请结点

//定义申请节点函数
Linklist * node_apply(datatype e)
{
	Linklist *p = (Linklist*)malloc(sizeof(Linklist));
	if(NULL == p)
	{
		printf("节点申请失败\n");
		return NULL;
	}
	//将数据存到节点中
	p->data = e;
	p->next = NULL;
	return p;
}

2.创建链表

//创建链表
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;
}

3.链表判空

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

4.遍历学生信息

//遍历学生信息
void stu_show(Linklist *L)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("无法遍历\n");
		return;
	}
	//遍历逻辑
	printf("学生信息如下:\n");
	printf("\n");
	//定义遍历指针遍历链表
	Linklist *q = L->next;
	while(q!=NULL)
	{
		printf("学生姓名:%s\t",q->data.name);
		printf("学生学号:%d\t",q->data.id);
		printf("学生成绩:%.2f\n",q->data.score);
		printf("\n");
		q = q->next;
	}
	printf("\n");
	return;
}

5.尾插法添加学生信息

//尾插法添加学生信息
int stu_insert_tail(Linklist *L,datatype e)
{
	//判断逻辑
	if(NULL == L)
	{
		printf("所给链表不合法\n");
		return -1;
	}
	//申请节点
	Linklist *p = node_apply(e);
	//遍历指针指向最后一个节点
	Linklist *q = L;
	while(q->next!=NULL)
	{
		q = q->next;
	}
	//尾插逻辑
	q->next = p;
	//表的变化
	L->len++;

	//printf("尾插成功\n");
	return 0;
}

6.根据姓名查找学生信息

//根据姓名查找学生信息
int stu_search_name(Linklist *L,char sname[20])
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}

	//定义遍历指针遍历链表
	Linklist *q = L->next;
	while(q != NULL)
	{
		if(!strcasecmp(sname,q->data.name)) //判断字符串是否相等只能用string函数族中的函数
		{
			printf("查找到如下信息\n");
			printf("学生姓名:%s\t",q->data.name);
			printf("学生学号:%d\t",q->data.id);
			printf("学生成绩:%.2f\n",q->data.score);
			return 0; 			//查找到直接退出函数体
		}
		q = q->next;
	}
	printf("未找到相关信息\n");
	return 1;
}

7.根据学号查找学生信息

//根据学号查找学生信息
int stu_search_id(Linklist *L,int sid)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("查找失败\n");
		return -1;
	}

	//定义遍历指针遍历链表
	Linklist *q = L->next;
	while(q != NULL)
	{
		if(q->data.id == sid)
		{
			printf("查找到如下信息:\n");
			printf("学生姓名:%s\t",q->data.name);
			printf("学生学号:%d\t",q->data.id);
			printf("学生成绩:%.2f\n",q->data.score);
			return 0; 			//查找到直接退出函数体
		}
		q = q->next;
	}
	printf("未找到相关信息\n");
	return 1;
}

8.根据姓名删除学生信息

//根据姓名删除学生信息
int stu_delete_name(Linklist *L,char dname[20])
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}

	//定义遍历指针遍历链表
	Linklist *q = L;
	while(NULL!=q->next && strcasecmp(dname,q->next->data.name)) 
	{
		q = q->next;
	}
	if(NULL != q->next)
	{
		Linklist *p = q->next; 		//标记
		q->next = p->next; 			//孤立
		free(p); 					//踢开
		p = NULL;

		//表的变化
		L->len--;
		printf("删除成功\n");
	}
	else
	{
		printf("未找到相关信息\n");
	}

	return 0;
}

9.根据学号删除学生信息

//根据学号删除学生信息
int stu_delete_id(Linklist *L,int did)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("删除失败\n");
		return -1;
	}

	//定义遍历指针遍历链表
	Linklist *q = L;
	while(NULL!=q->next && q->next->data.id!=did)
	{
		q = q->next;
	}
	if(NULL != q->next)
	{
		Linklist *p = q->next;
		q->next = p->next;
		free(p);
		p = NULL;

		L->len--;
		printf("删除成功\n");
	}
	else
	{
		printf("未找到相关信息\n");
	}

	return 0;
}

10.根据学生姓名修改学生信息

//根据学生姓名修改学生信息
int stu_update_name(Linklist *L,char uname[20],datatype e)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
	//修改逻辑
	Linklist *p = L->next; 		//定义遍历指针
	while(p!=NULL) 		//遍历链表
	{
		if(!strcasecmp(p->data.name,uname)) //判断字符串是否相等
		{
			p->data = e;
			break;
		}
		p = p->next;
	}
	printf("学生信息修改成功\n");
	return 0;
}

11.根据学生学号修改学生信息

//根据学生学号修改学生信息
int stu_update_id(Linklist *L,int uid,datatype e)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("修改失败\n");
		return -1;
	}
	//修改逻辑
	Linklist *p = L->next; 		//定义遍历指针
	while(p!=NULL) 		//遍历链表
	{
		if(p->data.id == uid)
		{
			p->data = e;
			break;
		}
		p = p->next;
	}
	printf("学生信息修改成功\n");
	return 0;
}

12.按学号将学生排序

//按学号将学生排序
void stu_sort_id(Linklist *L,int flag)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("排序失败\n");
	}
	//冒泡排序
	Linklist *q = L->next; 		//定义遍历指针
	if(flag) 		//升序
	{
		for(int i=0;i<L->len-1;i++)
		{
			q = L->next; 		//每一轮排序开始前都要将遍历指针指回第一个结点
			for(int j=0;j<L->len-i-1;j++)
			{
				if(q->data.id>q->next->data.id) 	//大升小降
				{
					datatype temp = q->data; 		//三杯水交换
					q->data = q->next->data;
					q->next->data = temp;
				}
				q = q->next;
			}
		}
	}
	else 			//降序
	{
		for(int i=0;i<L->len-1;i++)
		{
			q = L->next;
			for(int j=0;j<L->len-i-1;j++)
			{
				if(q->data.id<q->next->data.id)
				{
					datatype temp = q->data;
					q->data = q->next->data;
					q->next->data = temp;
				}
				q = q->next;
			}
		}
	}
	//printf("排序成功\n");
}

13.按成绩将学生排序

//按成绩将学生排序
void stu_sort_score(Linklist *L,int flag)
{
	//判断逻辑
	if(NULL==L || list_empty(L))
	{
		printf("排序失败\n");
	}
	//冒泡排序
	Linklist *q = L->next; 		//定义遍历指针
	if(flag) 		//升序
	{
		for(int i=0;i<L->len-1;i++)
		{
			q = L->next;
			for(int j=0;j<L->len-i-1;j++)
			{
				if(q->data.score>q->next->data.score)
				{
					datatype temp = q->data;
					q->data = q->next->data;
					q->next->data = temp;
				}
				q = q->next;
			}
		}
	}
	else 			//降序
	{
		for(int i=0;i<L->len-1;i++)
		{
			q = L->next;
			for(int j=0;j<L->len-i-1;j++)
			{
				if(q->data.score<q->next->data.score)
				{
					datatype temp = q->data;
					q->data = q->next->data;
					q->next->data = temp;
				}
				q = q->next;
			}
		}
	}
	//printf("排序成功\n");
}

主函数:

int main(int argc, const char *argv[])
{
	//新建一个存放学生信息的单链表
	Linklist *L = list_create();

	//初始化几个变量并存入单链表中
	datatype e1;
	strcpy(e1.name,"zy");
	e1.id = 924;
	e1.score = 96;
	stu_insert_tail(L,e1);

	datatype e2;
	strcpy(e2.name,"yl");
	e2.id = 128;
	e2.score = 95;
	stu_insert_tail(L,e2);

	datatype e3;
	strcpy(e3.name,"wjm");
	e3.id = 562;
	e3.score = 100;
	stu_insert_tail(L,e3);

	datatype e4;
	strcpy(e4.name,"sy");
	e4.id = 357;
	e4.score = 91;
	stu_insert_tail(L,e4);

	while(1) 		//循环打印系统菜单
	{
		printf("--------------------------------\n");
		printf("------欢迎进入学生管理系统------\n");
		printf("---------1.添加学生信息---------\n");
		printf("---------2.查找学生信息---------\n");
		printf("---------3.删除学生信息---------\n");
		printf("---------4.修改学生信息---------\n");
		printf("-------5.显示全部学生信息-------\n");
		printf("-------6.退出学生管理系统-------\n");
		printf("--------------------------------\n");
		printf("请填写数字以选择相应功能:\n");

		int select;
		scanf("%d",&select);
		getchar(); 			//吸收垃圾字符防止陷入死循环
		switch(select)
		{
		case 1:
			{
				//初始化数据
				datatype e;

				//终端输入学生信息
				printf("请输入学生姓名:\n");
				scanf("%s",e.name);
				printf("请输入学生学号:\n");
				scanf("%d",&e.id);
				printf("请输入学生成绩:\n");
				scanf("%f",&e.score);

				//尾插法添加学生信息
				stu_insert_tail(L,e);

				printf("添加成功\n");
				break;
			}
		case 2:
			{
				//提示查找方式
				printf("请选择按什么查找:\n");
				printf("1.姓名\t2.学号\n");
				int select1;
				scanf("%d",&select1);
				switch(select1)
				{
				case 1:
					{
						//终端输入想要查找的学生姓名
						char sname[20];
						printf("请输入要查找的学生姓名:\n");
						scanf("%s",sname);
						//根据姓名查找学生信息
						stu_search_name(L,sname);
						break;
					}
				case 2:
					{
						int sid;
						printf("请输入要查找的学生学号:\n");
						scanf("%d",&sid);
						//根据学号查找学生信息
						stu_search_id(L,sid);
						break;
					}
				default:
					{
						printf("你输入的数字有误!\n");
						break;
					}

				}
				break;
			}
		case 3:
			{
				//提示删除方式
				printf("请选择按什么删除:\n");
				printf("1.姓名\t2.学号\n");
				int select2;
				scanf("%d",&select2);
				switch(select2)
				{
				case 1:
					{
						char dname[20];
						printf("请输入要删除的学生姓名:\n");
						scanf("%s",dname);
						int res = stu_search_name(L,dname);
						if(!res)
						{
							char answer;
							getchar(); 		//吸收空格
							printf("你确定要删除吗?(回复y或n)\n");
							scanf("%c",&answer);
							if(answer=='y' || answer=='Y')
							{
								//根据姓名删除学生信息
								stu_delete_name(L,dname);
								break;
							}
							else if(answer=='n' || answer=='N')
							{
								printf("已取消删除\n");
								break;
							}
							else
							{
								printf("你输入的回复有误!\n");
								break;
							}
						}
						break;
					}
				case 2:
					{
						int did;
						printf("请输入要删除的学生学号:\n");
						scanf("%d",&did);
						int res = stu_search_id(L,did);
						if(!res)
						{
							char answer;
							getchar();
							printf("你确定要删除吗?(回复y或n)\n");
							scanf("%c",&answer);
							if(answer=='y' || answer=='Y')
							{
								//根据学号删除学生信息
								stu_delete_id(L,did);
								break;
							}
							else if(answer=='n' || answer=='N')
							{
								printf("已取消删除\n");
								break;
							}
							else
							{
								printf("你输入的回复有误!\n");
								break;
							}
						}
						break;
					}
				default:
					{
						printf("你输入的数字有误!\n");
						break;
					}
				}
				break;
			}
		case 4:
			{
				//提示修改方式
				printf("请选择按什么查找要修改的学生信息:\n");
				printf("1.姓名\t2.学号\n");
				int select3;
				scanf("%d",&select3);
				switch(select3)
				{
				case 1:
					{
						char uname[20];
						printf("请输入要修改信息的学生姓名:\n");
						scanf("%s",uname);
						//先判断是否存在终端输入的学生姓名
						int res = stu_search_name(L,uname);
						if(!res)
						{
							datatype e_name;

							printf("请输入新的学生姓名:\n");
							scanf("%s",e_name.name);
							printf("请输入新的学生学号:\n");
							scanf("%d",&e_name.id);
							printf("请输入新的学生成绩:\n");
							scanf("%f",&e_name.score);
							//根据学生姓名修改学生信息
							stu_update_name(L,uname,e_name);
						}
						break;
					}
				case 2:
					{
						int uid;
						printf("请输入要修改信息的学生学号:\n");
						scanf("%d",&uid);
						//判断是否存在终端输入的学生学号
						int res = stu_search_id(L,uid);
						if(!res)
						{
							datatype e_id;

							printf("请输入新的学生姓名:\n");
							scanf("%s",e_id.name);
							printf("请输入新的学生学号:\n");
							scanf("%d",&e_id.id);
							printf("请输入新的学生成绩:\n");
							scanf("%f",&e_id.score);
							//根据学生学号修改学生信息
							stu_update_id(L,uid,e_id);

						}
						break;
					}
				default:
					{
						printf("你输入的数字有误!\n");
						break;
					}
				}
				break;
			}
		case 5:
			{
				//提示显示方式
				printf("请选择学生排序方式:\n");
				printf("1.学号升序\n");
				printf("2.学号降序\n");
				printf("3.成绩升序\n");
				printf("4.成绩降序\n");
				int select4;
				scanf("%d",&select4);
				switch(select4)
				{
				case 1:
					{
						stu_sort_id(L,1);
						stu_show(L);
						break;
					}
				case 2:
					{
						stu_sort_id(L,0);
						stu_show(L);
						break;
					}
				case 3:
					{
						stu_sort_score(L,1);
						stu_show(L);
						break;
					}
				case 4:
					{
						stu_sort_score(L,0);
						stu_show(L);
						break;
					}
				default:
					{
						printf("你输入的数字有误!\n");
					}
				}

				break;
			}
		case 6:
			{
				printf("退出成功\n");
				exit(0); 			//跳出死循环
			}
		default:
			{
				printf("你输入的数字有误!\n");
			}
		}
	}
	return 0;
}

测试结果:

1.测试添加学生信息功能及查找学生信息功能:

用单链表实现学生信息管理系统(7.23周末作业)

查找刚刚添加的学生hqy的信息发现能够被查找到,通过姓名和学号皆可。

用单链表实现学生信息管理系统(7.23周末作业)

用单链表实现学生信息管理系统(7.23周末作业)

 2.测试删除学生信息功能:

1)按姓名删除

用单链表实现学生信息管理系统(7.23周末作业)

 删除学生hqy后再查找hqy无结果

用单链表实现学生信息管理系统(7.23周末作业)

 2)按学号删除

用单链表实现学生信息管理系统(7.23周末作业)

 学生zy的信息也被删除

用单链表实现学生信息管理系统(7.23周末作业)

 3.测试修改学生信息功能:

1)按姓名修改

用单链表实现学生信息管理系统(7.23周末作业)

 遍历学生列表可见已修改成功

用单链表实现学生信息管理系统(7.23周末作业)

 2)按学号修改

用单链表实现学生信息管理系统(7.23周末作业)

 4.测试学生排序功能:

1)按学号排序

升序:

用单链表实现学生信息管理系统(7.23周末作业)

降序: 

用单链表实现学生信息管理系统(7.23周末作业)

 2)按成绩排序

升序:

用单链表实现学生信息管理系统(7.23周末作业)

降序:

用单链表实现学生信息管理系统(7.23周末作业)

 5.退出系统

用单链表实现学生信息管理系统(7.23周末作业)

 文章来源地址https://www.toymoban.com/news/detail-419185.html

到了这里,关于用单链表实现学生信息管理系统(7.23周末作业)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【超详细】Java实现学生信息管理系统

     项目介绍:用java实现学生信息的管理,其中录入的数据包括:学号、姓名、年龄、居住地等,并且能够实现对学生信息的添加、修改、删除、查看功能。 一、创建项目 1、项目名称:myStudentManager 二、创建包 1、包名称:study 2、名字也可以自己进行命名 三、创建两个类 1、

    2024年02月04日
    浏览(30)
  • Android Studio实现学生信息管理系统

    该学生信息管理系统具有添加学生信息的功能、删除学生信息的功能、修改学生信息功能和查询学生信息的功能。利用Sqlite数据库实现对学生信息的增删改查,登录密码也采用了MD5加密的方式,更加注重用户隐私安全。除了有欢迎界面,还有注册和登录界面,满足应用的基础

    2024年02月02日
    浏览(27)
  • java毕业设计——基于JSP+sqlserver的学生信息管理系统设计与实现(毕业论文+程序源码)——学生信息管理系统

    大家好,今天给大家介绍基于JSP+sqlserver的学生信息管理系统设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦。需要下载开题报告PPT模板及论文答辩PPT模板等的小伙伴,可以进入我的博客主页查看左侧最下面栏目中的自助下载方法哦 文章目录: 随着学校规模的

    2024年02月04日
    浏览(49)
  • C语言实现学生信息管理系统(附原码)

    本人的C语言学习完后,用所学的知识自己实现了一个学生管理系统,新手一个,代码还有待完善,欢迎大家在评论区指出错误! 一、流程图 二、函数的目录  三、程序介绍  1.主要功能: 添加学生信息、打印学生信息、查找学生信息、添加学生信息、修改学生信息、计算学

    2024年02月12日
    浏览(35)
  • python基于Tkinter实现学生信息管理系统

    1.添加学生成绩:管理员可以在系统中添加学生的成绩信息,包括学生姓名、学号、课程名称、成绩等。 2.删除学生成绩:管理员可以根据学生的学号或者姓名删除学生的成绩信息。 3.修改学生成绩:管理员可以修改学生的成绩信息,包括学生姓名、学号、课程名称、成绩等

    2024年02月08日
    浏览(61)
  • Java基础——学生成绩信息管理系统(简单实现)

    1、 定义一个学生类 Student,包含姓名、成绩信息; 2、使用 ArrayList集合存储学生对象; 3、 对集合中的元素进行增删查改的操作。 学生类可以包含姓名、成绩、学号、年龄等等,这里只包含了前两项学生类属性。 在该类中定义了简单的增、删、查、改的方法。 其中,遍历集

    2024年02月11日
    浏览(25)
  • JAVA学生信息管理系统(数据库实现)

    这次的项目是用数据库实现学生的信息管理系统,有三步组成,写项目链接数据库实现相关的操作 开发工具: eclipse、MySQL、navicat、mysql-connector-java-8.0.27     (1)主页面   (2)添加界面   (3)删除界面    (4)修改界面  (5)查找界面 (6)数据库链接   添加Java驱动包

    2024年02月11日
    浏览(31)
  • 【Java:JDBC+MySQL实现学生信息管理系统】

    此次使用Java JDBC+MySQL数据库实现一个简易的学生管理系统(没有前端界面)。 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。JDBC也是Sun Microsystems的商标。我

    2024年02月05日
    浏览(46)
  • 学生管理系统——C语言单链表结构存储

    学生管理系统,是用c语言程序设计的一款简便软件项目,能对学生信息进行增删查改、排序、导入、导出,使用链表的结构存储。 1.学生信息批量录入; 2.查询所有学生信息; 3.通过学号删除学生信息; 4.通过学号、姓名查询学生信息; 5.通过学号修改学生信息; 6.在表中某

    2024年02月02日
    浏览(31)
  • 基于python的学生信息管理系统的设计与实现

    小白学python,做了一个基础小系统,给大家分享一下(欢迎大神指导) 目录 步骤 1.设计要求 2.设计步骤 (1)导入os模块,创建一个文件夹用于存储数据  (2)定义一个菜单函数 (3)实现学生信息的录入功能 (4)定义了一个save函数用于录入功能的调用 (5)查询功能的实现

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包