链表《5》使用链表实现学生成绩管理系统

上次我使用动态数组结构体实现了学生成绩管理系统:http://blog.csdn.net/u010105970/article/details/17752193


这次学习了链表对链表也有所了解,我就想着用链表实现学生成绩管理系统,我的这个学生成绩管理系统和前一个的功能是一样的,只是实现的方法不同,因为使用链表实现对数据的增删改查不会引起大量数据的变化,所以效率上会有所提高

程序模块:


程序中使用到的函数:

函数名

函数功能

InputStudent

输入学生信息

OutputStudent

输出学生信息

DeleteStudent

删除学生信息

SearchStudent

查找学生信息

ChangeStudent

修改学生信息

InsertStudent

增加学生信息

ScortByChinese

对学生的语文成绩排序

ScortByMath

对学生的数学成绩排序

ScortByEnglish

对学生的英语成绩排序

ScortByTotal

对学生的总分排序


程序主界面:

链表《5》使用链表实现学生成绩管理系统_第1张图片


功能选择界面:

链表《5》使用链表实现学生成绩管理系统_第2张图片


首先定义一个学生结构和一个结点结构

学生结构:

struct Student//学生结构
{
	char Name[10];//姓名
	int Age;//年龄
	int No;//学号
	float Score[3];//三科的成绩
	float Total;//总分
	float Ave;//平均分
};


结点结构:

typedef struct Node//结点
{
	struct Student st;//数据域

	struct Node *pNext;//指针域
}NODE, *PNODE;
/*
NODE等价于struct Student st
PNODE等价于struct Node *pNext
*/

然后定义一些函数用于处理学生信息

函数名:PNODE InputStudent(void)

函数功能:输入学生信息

函数代码:

//输入函数,用于输入学生信息
PNODE InputStudent(void)
{
	int len;//学生的人数

	NODE stu;//学生结构

	//定义一个头结点并且为头结点分配内存
	PNODE pHead = (PNODE)malloc(sizeof(NODE));

	//判断内存是否为空
	if(NULL == pHead)
	{
		printf("内存分配失败,程序终止!\n");

		exit(-1);
	}

	//定义一个指向头结点的指针
	PNODE pTail = pHead;
	pTail->pNext = NULL;//清空指针域

	printf("请输入学生的人数:");
	scanf("%d",&len);

	for(int i=0; ist = stu.st;
		
		//将新结点挂到老结点后
		pTail->pNext = pNew;
		
		//清空新结点的指针域
		pNew->pNext = NULL;
		
		//将pTail移到新结点上
		pTail = pNew;
	}

	return pHead;
}


实现效果:

输入学生的人数:

链表《5》使用链表实现学生成绩管理系统_第3张图片


输入第1个学生的信息

链表《5》使用链表实现学生成绩管理系统_第4张图片


输入第2个学生的信息:

链表《5》使用链表实现学生成绩管理系统_第5张图片


函数名:void OutputStudent(PNODE pHead)

函数功能:输出学生信息

函数代码:

//输出学生信息
void OutputStudent(PNODE pHead)
{
	//定义一个指针用于遍历学生信息
	PNODE p = pHead->pNext;

	printf("姓名 年龄  学号  语文  数学  英语  总分 平均分\n");
	
	while(NULL != p)
	{
		printf("%s  %d  %d  %g  %g  %g  %g  %g\n", p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

		p = p->pNext;
	}
}


测试程序:

链表《5》使用链表实现学生成绩管理系统_第6张图片


函数名:void DeleteStudent(PNODE pHead)

函数功能:删除学生信息

函数代码:

//删除学生信息
void DeleteStudent(PNODE pHead)
{
	PNODE p = pHead;

	int i = 0;

	int pos;

	printf("请输入你需要删除的学生的编号:");
	scanf("%d",&pos);

	while(NULL != p->pNext && ipNext;

		i++;
	}

	if(NULL == p->pNext || i>pos-1)
	{
		printf("没找到需要删除的学生的编号!\n");

		return;
	}

	PNODE q = p->pNext;

	p->pNext = q->pNext;

	free(q);
	q == NULL;

	printf("你已经成功删除了第%d个学生的信息!\n",pos);
}


测试程序:

选择需要删除的学生的编号

链表《5》使用链表实现学生成绩管理系统_第7张图片


删除成功的标志:

链表《5》使用链表实现学生成绩管理系统_第8张图片


删除后的学生信息:

链表《5》使用链表实现学生成绩管理系统_第9张图片


函数名:void SearchStudent(PNODE pHead)

函数功能:查找学生信息

函数代码:

//查找学生信息
void SearchStudent(PNODE pHead)
{
	char Name[10];

	printf("请输入你需要查找的学生的姓名:");
	scanf("%s",Name);

	PNODE p = pHead->pNext;

	while(NULL != p)
	{
		if(0 == strcmp(Name,p->st.Name))
		{
			printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);
		}

		p = p->pNext;
	}
}


测试程序:

查找李四的信息

链表《5》使用链表实现学生成绩管理系统_第10张图片


函数名:void ChangeStudent(PNODE pHead)

函数功能:修改学生信息

函数代码

//修改学生信息
void ChangeStudent(PNODE pHead)
{
	char Name[10];

	printf("请输入你需要修改的学生的姓名:");
	scanf("%s",&Name);

	PNODE p = pHead->pNext;//定义一个指针用于遍历学生信息


	while(NULL != p)
	{
		if(0 == strcmp(Name, p->st.Name))
		{
			printf("姓名 年龄  学号  语文  数学  英语  总分 平均分\n");
			
			printf("修改前的学生信息!\n");
			printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

			system("pause");
			system("cls");//清屏

			printf("请输入新的学生姓名:");
			scanf("%s", p->st.Name);

			printf("请输入新的学生年龄:");
			scanf("%d", &p->st.Age);

			printf("请输入新的学生学号:");
			scanf("%d", &p->st.No);

			printf("请输入新的学生的语文成绩:");
			scanf("%f", &p->st.Score[0]);

			printf("请输入新的学生的数学成绩:");
			scanf("%f", &p->st.Score[1]);
		
			printf("请输入新的学生的英语成绩:");
			scanf("%f", &p->st.Score[2]);

			//计算总分
			p->st.Total = p->st.Score[0] + p->st.Score[1] + p->st.Score[2];
		
			//计算平均分
			p->st.Ave = p->st.Total / 3.0f;

			break;
		}

		p = p->pNext;
	}
}


测试程序:

修改前李四的成绩

链表《5》使用链表实现学生成绩管理系统_第11张图片


修改李四的成绩

链表《5》使用链表实现学生成绩管理系统_第12张图片


链表《5》使用链表实现学生成绩管理系统_第13张图片


修改后李四的成绩:

链表《5》使用链表实现学生成绩管理系统_第14张图片


函数名:void InsertStudent(PNODE pHead)

函数功能:增加学生信息

函数代码:

//增加学生信息
void InsertStudent(PNODE pHead)
{
	PNODE p = pHead;

	int i = 0;

	struct Student stu;//学生结构

	int pos;//插入结点的位置

	printf("请输入插入学生的位置:");
	scanf("%d",&pos);

	while(NULL != p && ipNext;

		i++;
	}

	if(NULL == p || i>pos)
	{
		printf("插入结点的位置不存在!\n");

		return;
	}

	printf("你将在第%d个学生后面插入一个学生\n",pos-1);

	printf("请输入第%d个学生的姓名:",pos);
	scanf("%s",stu.Name);

	printf("请输入第%d个学生的年龄:",pos);
	scanf("%d",&stu.Age);

	printf("请输入第%d个学生的学号:",pos);
	scanf("%d",&stu.No);

	printf("请输入第%d个学生的语文成绩:",pos);
	scanf("%f",&stu.Score[0]);

	printf("请输入第%d个学生的数学成绩:",pos);
	scanf("%f",&stu.Score[1]);

	printf("请输入第%d个学生的英语成绩:",pos);
	scanf("%f",&stu.Score[2]);

	//计算总分
	stu.Total = stu.Score[0] + stu.Score[1] + stu.Score[2];

	//计算平均分
	stu.Ave = stu.Total / 3.0f;

	PNODE pNew = (PNODE)malloc(sizeof(NODE));

	if(NULL == pNew)
	{
		printf("动态内存分配失败,程序终止!\n");

		exit(-1);
	}

	pNew->st = stu;
	PNODE q = p->pNext;
	p->pNext = pNew;
	pNew->pNext = q;
}


测试程序:

增加王五的信息

链表《5》使用链表实现学生成绩管理系统_第15张图片


增加后的效果:

链表《5》使用链表实现学生成绩管理系统_第16张图片


函数名:void ScortByChinese(PNODE pHead)

函数功能:对学生的语文成绩排序

函数代码:

//对学生的语文成绩排序
void ScortByChinese(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[0] < q->st.Score[0])//当前一个学生的语文成绩小于后一个学生的语文成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}


测试程序:

排序前的学生信息

链表《5》使用链表实现学生成绩管理系统_第17张图片


排序后的学生信息:

链表《5》使用链表实现学生成绩管理系统_第18张图片



函数名:void ScortByMath(PNODE pHead)
函数功能:对数学成绩排序
函数代码:
//对学生的数学成绩排序
void ScortByMath(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[1] < q->st.Score[1])//当前一个学生的数学成绩小于后一个学生的数学成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}

测试程序:
排序前:
链表《5》使用链表实现学生成绩管理系统_第19张图片


排序后:
链表《5》使用链表实现学生成绩管理系统_第20张图片


函数名:void ScortByEnglish(PNODE pHead)
函数功能:对学生的英语成绩排序
函数代码:
//对学生的英语成绩排序
void ScortByEnglish(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[2] < q->st.Score[2])//当前一个学生的英语成绩小于后一个学生的英语成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}


测试程序:
排序前
链表《5》使用链表实现学生成绩管理系统_第21张图片


排序后:
链表《5》使用链表实现学生成绩管理系统_第22张图片


函数名:void ScortByTotal(PNODE pHead)
函数功能:对学生的总分排序
函数代码:
//对学生的总分排序
void ScortByTotal(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Total < q->st.Total)//当前一个学生的总分小于后一个学生的总分时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}

测试程序:
排序前
链表《5》使用链表实现学生成绩管理系统_第23张图片


排序后
链表《5》使用链表实现学生成绩管理系统_第24张图片

学生管理系统的全部代码:
#include 
#include 
#include 

struct Student//学生结构
{
	char Name[10];//姓名
	int Age;//年龄
	int No;//学号
	float Score[3];//三科的成绩
	float Total;//总分
	float Ave;//平均分
};


typedef struct Node//结点
{
	struct Student st;//数据域

	struct Node *pNext;//指针域
}NODE, *PNODE;
/*
NODE等价于struct Student st
PNODE等价于struct Node *pNext
*/

//输入函数,用于输入学生信息
PNODE InputStudent(void);

//输出学生信息
void OutputStudent(PNODE pHead);

//删除学生信息
void DeleteStudent(PNODE pHead);

//查找学生信息
void SearchStudent(PNODE pHead);

//修改学生信息
void ChangeStudent(PNODE pHead);

//增加学生信息
void InsertStudent(PNODE pHead);

//对学生的语文成绩排序
void ScortByChinese(PNODE pHead);

//对学生的数学成绩排序
void ScortByMath(PNODE pHead);

//对学生的英语成绩排序
void ScortByEnglish(PNODE pHead);

//对学生的总分排序
void ScortByTotal(PNODE pHead);

void main()
{
	printf("================================================================================\n\n");
	printf("================================================================================\n\n");
	printf("*************************欢迎使用学生成绩管理系统*******************************\n\n");
	printf("-----------------------------------------------------------------制作人:梅沙小子\n\n");
	printf("********************************************************************************\n\n");
	printf("================================================================================\n\n");


	printf("请按任意将进入学生管理系统:\n");
	getchar();
	system("cls");

	printf("================================================================================\n\n");
	printf("------------------------ 请选择要操作的命令:-----------------------------------\n\n");
	printf("-------------------------- 1  输入学生信息--------------------------------------\n\n");
	printf("-------------------------- 2  输出学生信息--------------------------------------\n\n");
	printf("-------------------------- 3  删除学生信息--------------------------------------\n\n");
	printf("-------------------------- 4  查找学生信息--------------------------------------\n\n");
	printf("-------------------------- 5  修改学生信息--------------------------------------\n\n");
	printf("-------------------------- 6  增加学生信息--------------------------------------\n\n");
	printf("-------------------------- 7  将学生的语文成绩按从大到小排----------------------\n\n");
	printf("-------------------------- 8  将学生的数学成绩按从大到小排----------------------\n\n");
	printf("-------------------------- 9  将学生的英语成绩按从大到小排----------------------\n\n");
    printf("-------------------------- 10 将学生的总成绩按从大到小排------------------------\n\n");
	printf("================================================================================\n\n");

	int Item;//保存操作命令

	PNODE pHead = NULL;//定义一个指针

	while(1)
	{
		printf("请选择操作命令:");
		scanf("%d",&Item);

		system("cls");//清屏

		switch(Item)
		{
		    case 1://输入学生信息
			{
				pHead = InputStudent();
			}
			break;

			case 2://输出学生信息
			{
				OutputStudent(pHead);
			}
			break;

			case 3://删除学生信息
			{
				DeleteStudent(pHead);
			}
			break;

			case 4://查找学生信息
			{
				SearchStudent(pHead);
			}
			break;

			case 5://修改学生信息
			{
				ChangeStudent(pHead);
			}
			break;

			case 6://增加学生信息
			{
				InsertStudent(pHead);
			}
			break;

			case 7://对学生的语文成绩排序
			{
				ScortByChinese(pHead);
				OutputStudent(pHead);
			}
			break;

			case 8://对学生的数学成绩排序
			{
				ScortByMath(pHead);
				OutputStudent(pHead);
			}
			break;

			case 9://对学生的英语成绩排序
			{
				ScortByEnglish(pHead);
				OutputStudent(pHead);
			}
			break;

			case 10://对学生的总分排序
			{
				ScortByTotal(pHead);
				OutputStudent(pHead);
			}
			break;
			default:
			break;
		}
	}

	system("pause");
}


//输入函数,用于输入学生信息
PNODE InputStudent(void)
{
	int len;//学生的人数

	NODE stu;//学生结构

	//定义一个头结点并且为头结点分配内存
	PNODE pHead = (PNODE)malloc(sizeof(NODE));

	//判断内存是否为空
	if(NULL == pHead)
	{
		printf("内存分配失败,程序终止!\n");

		exit(-1);
	}

	//定义一个指向头结点的指针
	PNODE pTail = pHead;
	pTail->pNext = NULL;//清空指针域

	printf("请输入学生的人数:");
	scanf("%d",&len);

	for(int i=0; ist = stu.st;
		
		//将新结点挂到老结点后
		pTail->pNext = pNew;
		
		//清空新结点的指针域
		pNew->pNext = NULL;
		
		//将pTail移到新结点上
		pTail = pNew;
	}

	return pHead;
}

//输出学生信息
void OutputStudent(PNODE pHead)
{
	//定义一个指针用于遍历学生信息
	PNODE p = pHead->pNext;

	printf("姓名 年龄  学号  语文  数学  英语  总分 平均分\n");
	
	while(NULL != p)
	{
		printf("%s  %d  %d  %g  %g  %g  %g  %g\n", p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

		p = p->pNext;
	}
}

//删除学生信息
void DeleteStudent(PNODE pHead)
{
	PNODE p = pHead;

	int i = 0;

	int pos;

	printf("请输入你需要删除的学生的编号:");
	scanf("%d",&pos);

	while(NULL != p->pNext && ipNext;

		i++;
	}

	if(NULL == p->pNext || i>pos-1)
	{
		printf("没找到需要删除的学生的编号!\n");

		return;
	}

	PNODE q = p->pNext;

	p->pNext = q->pNext;

	free(q);
	q == NULL;

	printf("你已经成功删除了第%d个学生的信息!\n",pos);
}
//查找学生信息
void SearchStudent(PNODE pHead)
{
	char Name[10];

	printf("请输入你需要查找的学生的姓名:");
	scanf("%s",Name);

	PNODE p = pHead->pNext;

	while(NULL != p)
	{
		if(0 == strcmp(Name,p->st.Name))
		{
			printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);
		}

		p = p->pNext;
	}
}

//修改学生信息
void ChangeStudent(PNODE pHead)
{
	char Name[10];

	printf("请输入你需要修改的学生的姓名:");
	scanf("%s",&Name);

	PNODE p = pHead->pNext;//定义一个指针用于遍历学生信息


	while(NULL != p)
	{
		if(0 == strcmp(Name, p->st.Name))
		{
			printf("姓名 年龄  学号  语文  数学  英语  总分 平均分\n");
			
			printf("修改前的学生信息!\n");
			printf("%s %d %d %g %g %g %g %g\n",p->st.Name, p->st.Age, p->st.No, p->st.Score[0], p->st.Score[1], p->st.Score[2], p->st.Total, p->st.Ave);

			system("pause");
			system("cls");//清屏

			printf("请输入新的学生姓名:");
			scanf("%s", p->st.Name);

			printf("请输入新的学生年龄:");
			scanf("%d", &p->st.Age);

			printf("请输入新的学生学号:");
			scanf("%d", &p->st.No);

			printf("请输入新的学生的语文成绩:");
			scanf("%f", &p->st.Score[0]);

			printf("请输入新的学生的数学成绩:");
			scanf("%f", &p->st.Score[1]);
		
			printf("请输入新的学生的英语成绩:");
			scanf("%f", &p->st.Score[2]);

			//计算总分
			p->st.Total = p->st.Score[0] + p->st.Score[1] + p->st.Score[2];
		
			//计算平均分
			p->st.Ave = p->st.Total / 3.0f;

			break;
		}

		p = p->pNext;
	}
}

//增加学生信息
void InsertStudent(PNODE pHead)
{
	PNODE p = pHead;

	int i = 0;

	struct Student stu;//学生结构

	int pos;//插入结点的位置

	printf("请输入插入学生的位置:");
	scanf("%d",&pos);

	while(NULL != p && ipNext;

		i++;
	}

	if(NULL == p || i>pos)
	{
		printf("插入结点的位置不存在!\n");

		return;
	}

	printf("你将在第%d个学生后面插入一个学生\n",pos-1);

	printf("请输入第%d个学生的姓名:",pos);
	scanf("%s",stu.Name);

	printf("请输入第%d个学生的年龄:",pos);
	scanf("%d",&stu.Age);

	printf("请输入第%d个学生的学号:",pos);
	scanf("%d",&stu.No);

	printf("请输入第%d个学生的语文成绩:",pos);
	scanf("%f",&stu.Score[0]);

	printf("请输入第%d个学生的数学成绩:",pos);
	scanf("%f",&stu.Score[1]);

	printf("请输入第%d个学生的英语成绩:",pos);
	scanf("%f",&stu.Score[2]);

	//计算总分
	stu.Total = stu.Score[0] + stu.Score[1] + stu.Score[2];

	//计算平均分
	stu.Ave = stu.Total / 3.0f;

	PNODE pNew = (PNODE)malloc(sizeof(NODE));

	if(NULL == pNew)
	{
		printf("动态内存分配失败,程序终止!\n");

		exit(-1);
	}

	pNew->st = stu;
	PNODE q = p->pNext;
	p->pNext = pNew;
	pNew->pNext = q;
}

//对学生的语文成绩排序
void ScortByChinese(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[0] < q->st.Score[0])//当前一个学生的语文成绩小于后一个学生的语文成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}

//对学生的数学成绩排序
void ScortByMath(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[1] < q->st.Score[1])//当前一个学生的数学成绩小于后一个学生的数学成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}

//对学生的英语成绩排序
void ScortByEnglish(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Score[2] < q->st.Score[2])//当前一个学生的英语成绩小于后一个学生的英语成绩时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}

//对学生的总分排序
void ScortByTotal(PNODE pHead)
{
	PNODE p, q;//定义两个指针
	
	NODE temp;

	for(p=pHead->pNext; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL !=q; q=q->pNext)
		{
			if(p->st.Total < q->st.Total)//当前一个学生的总分小于后一个学生的总分时
			{
				temp.st  = p->st;//交换学生的位置
				p->st =  q->st;
				q->st = temp.st;
			}
		}
	}
}



你可能感兴趣的:(C语言)