C语言实现学生成绩管理系统

C语言实现学生成绩管理系统

该系统是由带头结点的单链表实现的,实现了增删改查等的基本功能。
在打印的时候会有界面的不整齐,但是基本功能都已经实现。
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<string.h>

typedef  struct LNode
{
	char number[20];//学号
	char name[20];//姓名
	float score1;
	float score2;
	float score3;
	float average;//平均成绩
	float total;//总成绩
	struct LNode *next;
}LNode,*LinkList;

void InitList(LinkList plist);

void Insert_Head(LinkList plist,char* number,char* name,
	float score1,float score2,float score3);

LinkList Search(LinkList plist,char* key,int flag);

void Delete_Key(LinkList plist,char* key);

void Delete_Head(LinkList plist);

int GetLength(LinkList plist);

int IsEmpty(LinkList plist);

void Show(LinkList plist);

void Clear(LinkList plist);

void Destory(LinkList plist);

static LinkList _Apply_Node(char* number,char* name,float score1,float score2,
	float score3,float average,float total,LinkList next)
{
	LinkList s=(LinkList)malloc(sizeof(LNode));
	assert(s != NULL);
	if(s == NULL)
	{
		printf("Apply Space Fail\n");
		return NULL;
	}
	strcpy_s(s->name,20,name);
	strcpy_s(s->number, 20,number);
	s->score1 = score1;
	s->score2 = score2;
	s->score3 = score3;
	s->average = average;
	s->total = total;
	s->next = next;

	return s;
}

void InitList(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("Singly LinkList Initialization Failed\n");
		return;
	}
	plist->next = NULL;
}

void Insert_Head(LinkList plist,char* number,char* name,
	float score1,float score2,float score3)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return;
	}
	float total = score1+score2+score3;
	float average = total/3;
	plist->next = _Apply_Node(number,name,score1,score2,score3,
		average,total,plist->next);
}

LinkList Search(LinkList plist,char* key,int flag)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		return NULL;
	}
	LinkList s = plist->next;
	while (s->next != NULL)
	{
		if(flag == 1)
		{
			if(s->name == key)
			{
				break;
			}
		}		
		else
		{
			if(s->number == key)
			{
				break;
			}
		}
		s = s->next;
	}
	return s;
}

void Delete_Key(LinkList plist,char* key)
{
	assert(plist != NULL);
	LinkList s = plist,q;
	while (s->next != NULL)
	{
		if(s->next->name == key)
		{
			q = s->next;
			s->next = q->next;
			free(q);
			break;
		}
		s=s->next;
	}
}

void Delete_Head(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return;
	}

	LinkList q = plist->next;
	if(q != NULL)
	{
		plist->next = q->next;  
	}
	
	free(q);	
}
int GetLength(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return 0;
	}
	int length = 0;
	for(LinkList p = plist->next;p != NULL;p = p->next)
	{
		length++;
	}
	return length;
}

int IsEmpty(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The HeadNode Is NULL\n");
		return 1;
	}

	if(plist->next == NULL)
	{
		printf("The FirstNode Is NULL\n");
		return 2;
	}
	return 0;
}

void Show(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return;
	}
	printf("学号  姓名  成绩1  成绩2  成绩3  平均成绩  总成绩\n");
	for(LinkList p = plist->next;p != NULL;p = p->next)
	{
		printf("%s  %s  %.2f  %.2f  %.2f   %.2f   %.2f\n",p->number,
		p->name,p->score1,p->score2,p->score3,p->average,p->total);
	}
}

void Clear(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return;
	}
	while (!IsEmpty(plist))
	{
		Delete_Head(plist);
	}
}

void Destory(LinkList plist)
{
	assert(plist != NULL);
	if(plist == NULL)
	{
		printf("The Single LinkList is NULL\n");
		return;
	}

	free(plist->next);
	plist->next=NULL;
}


void Bubble_Sort(LinkList s1)
{
	assert(s1 != NULL);
	if(s1 == NULL)
	{
		printf("Bubble_Sort:Invalid List\n");
		return;
	}
	int flag = 0;
	LinkList s = s1,p = s->next,q = p->next;
	LinkList order = s1;
	while(1)
	{
		//判断是否有序,如果有序,直接退出
		order = s1;
		for(;order->next != NULL && order->next->next != NULL;order = order->next)
		{			
			if(order->next->average < order->next->next->average)
			{
				flag = 1;
			}
			else
			{
				flag = 0;
				s = order;
				break;
			}					
		}
		if(flag == 1)
		{
			break;
		}
		p = s->next,q = p->next;
		while(q != NULL)
		{			
			if(p->average > q->average)
			{
				q = q->next;
				s->next = p->next;
				p->next = q;
				s->next->next = p;
				s = s->next;
			}
			else
			{
				p = p->next,q = q->next,s = s->next;
			}					
		}		
	}
	
}
void Menu()
{
	printf("******……欢迎来到学生成绩管理系统******……\n");
	printf("******…………0-----退出******…………\n");
	printf("******…………1-----插入******…………\n");
	printf("******…………2-----修改(根据学号)******…………\n");
	printf("******…………3-----删除(学号)******…………\n");
	printf("******…………4-----查询(1姓名,2学号)******…………\n");
	printf("******…………5-----排序(平均成绩)******…………\n");
	printf("******…………6-----打印******…………\n");	
}
int main()
{
	int choose = 0;
	char number[20]={0};
	char name[20]={0};//姓名
	float score1=0;
	float score2=0;
	float score3=0;
	float average=0;//平均成绩
	float total=0;//总成绩
	int searchid = 0;
	LNode s1;
	LinkList result = NULL;
	Menu();

	InitList(&s1);
	while(1)
	{
		printf("请输入你的选择:");
		scanf("%d",&choose);
		if(0 == choose)
		{
			Destory(&s1);
			printf("已成功退出本系统\n");
			break;
		}
		switch (choose)
		{
		case 1:
		//printf("******…………1-----插入******…………\n");
			printf("请输入要插入的学生的学号、姓名、成绩1、成绩2、成绩3:");
			scanf("%s %s %f %f %f",&number,&name,&score1,&score2,&score3);
			Insert_Head(&s1,number,name,score1,score2,score3);
			break;
		case 2:
		//printf("******…………2-----修改(根据学号修改成绩1)******…………\n");
			printf("请输入要修改的学生的学号、成绩1");
			scanf("%s %f",&number,&score1);
			result = Search(&s1,number,2);
			result->score1 = score1;
			break;
		case 3:
			//printf("******…………3-----删除(根据学号)******…………\n");
			printf("请输入要删除的学生的学号:");
			scanf("%s",&number);
			Delete_Key(&s1,number);
			printf("已成功删除该学生的所有信息\n");
			break;
		case 4:
			//printf("******…………4-----查询(1姓名,2学号)******…………\n");
			printf("请输入查询条件(1姓名,2学号):");
			scanf("%d",&searchid);
			if(searchid == 1)
			{
				printf("请输入要查询的学生的姓名:");
				scanf("%s",&name);
				result = Search(&s1,name,1);
			}			
			else if(searchid == 2)
			{
				printf("请输入要查询的学生的学号:");
				scanf("%s",&number);
				result = Search(&s1,number,2);
			}
			else
			{
				printf("错误输入\n");
			}

			if( result == NULL)
			{
				printf("找不到该学生信息\n");
			}
			else
			{
				printf("学号  姓名  成绩1  成绩2	  成绩3	平均成绩  总成绩‐n");
				printf("%s  %s  %.2f  %.2f  %.2f   %.2f   %.2f\n",result->number,result->name,result->score1,
					result->score2,result->score3,result->average,result->total);

			}
					break;
		case 5:
		//	printf("******…………5-----排序(平均成绩)******…………\n");
			Bubble_Sort(&s1);
			printf("已按照平均成绩排序\n");
			break;
		case 6:
			Show(&s1);
			break;
		default:
			printf("请重新选择\n");
			break;
		}
	}	
	
	system("pause");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值