【C语言】学生管理系统

本文展示了一个使用C语言编写的简单学生管理系统,包括学生信息的创建、查找、删除、插入以及排序等功能。系统能够管理学生的学号、性别和两门成绩,并提供了头插法插入、按值删除、按学号排序和按数学成绩排序等操作。
摘要由CSDN通过智能技术生成

前言

在前面我们已经实现了链表的创建、查找、删除、插入,下面我们使用这些内容实现一个学生管理系统

大概功能如下

在这里插入图片描述
只实现了管理学生的学号、性别、数学成绩和语文成绩。

之所以没有姓名,纯属是为了好测试代码

全部代码如下

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//学生信息封装成结构体
typedef struct students{
	int ID;
	int sex;
	int Math_Scorce;
	int Chinese_Scorce;
}Node_Data;


typedef struct node{
    Node_Data data;
    struct node* next;
}Lnode;

//创建链表头节点,返回值为struct node*
Lnode* Create_Head_Node()
{
    //动态内存申请
    Lnode* Head_Node = (Lnode *)malloc(sizeof(Lnode));
    if(Head_Node == NULL)
    	return NULL;
    else
    {
	    //初始化头节点
	   // Head_Node->data = 1;  //这个可以随意赋值
	   Head_Node->next = NULL;
	   return Head_Node;
    }
}

//创建新的节点,并给此节点赋值
Lnode* Create_New_Node(Node_Data temp)
{
    Lnode* New_Node = (Lnode *)malloc(sizeof(Lnode));
    
    if(New_Node == NULL)
    	return NULL;
    else
    {
	    New_Node->data.ID = temp.ID;
		New_Node->data.sex = temp.sex;
		New_Node->data.Math_Scorce = temp.Math_Scorce;
		New_Node->data.Chinese_Scorce = temp.Chinese_Scorce;
	    New_Node->next = NULL;
	    
	    return New_Node;
    }
}

//打印链表
void Printf_List(Lnode* Head_Node)
{
    Lnode* pMove = Head_Node->next;
    
    if(pMove == NULL)
    {
       // printf("打印失败\n");
        return ;
    }
    else
    {
        while(pMove != NULL)
        {
			if(pMove->data.sex == 0)
				printf("%d\t女\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
			else
				printf("%d\t男\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
            pMove = pMove->next;
        }
        printf("\n");
    }
}

//头插法插入数据
void Insert_Data_List(Lnode* Head_Node,Node_Data temp)
{
    Lnode* New_Node = Create_New_Node(temp);
    
    if(New_Node == NULL)
    {
        printf("插入失败\n");
        return ;
    }
    else
    {
        New_Node->next = Head_Node->next;
        Head_Node->next = New_Node;
        //printf("插入成功\n");
        return ;
    }
}

//按值删除
void Delete_AccordValue_List(Lnode* Head_Node,Node_Data posdata)
{
    Lnode* posNode = Head_Node->next;
    Lnode* posNodeFornt = Head_Node;
    
    if(posNode == NULL)
    {
        printf("此链表为空,删除失败\n");
        return ;
    }
    else
    {
        while(posNode->data.ID != posdata.ID)
        {
            posNodeFornt = posNode;
            posNode = posNode->next;
            if(posNode == NULL)
            {
                printf("删除失败,不存在该值\n");
                return ;
            }
        }
        posNodeFornt->next = posNode->next;
        free(posNode);
        printf("删除成功\n");
    }
}

//后继插入
void Inster_PostionRear_List(Lnode* Head_Node,Node_Data posdata,Node_Data data)
{
	Lnode* posNode = Head_Node->next;
    Lnode* New_Node = Create_New_Node(data);

	if(posNode == NULL)
	{
		printf("插入失败\n");
		return ;
	}
	else
	{
		while(posNode->data.ID != posdata.ID)
		{
			posNode = posNode->next;
			if(posNode == NULL)
			{
				printf("插入失败\n");
				return ;
			}
		}
		New_Node->next = posNode->next;
		posNode->next = New_Node;
		printf("插入成功!!!!\n");
	}
	
}

//查找链表中的某个值 
void Find_CertainValue_List(Lnode* Head_Node,Node_Data value)
{
	Lnode* pMove = Head_Node->next;

	if(pMove == NULL)
	{
		printf("查找失败,链表为空\n");
		return ;
	}
	else
	{
		while(pMove->data.ID !=  value.ID)
		{
			pMove = pMove->next;
			if(pMove == NULL)
			{
				printf("查找失败,没有该学生\n");
				return ;
			}
		}
	    printf("学号\t性别\t数学\t语文\n");

		if(pMove->data.sex == 0)
			printf("%d\t女\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
		else
			printf("%d\t男\t%d\t%d\n",pMove->data.ID,pMove->data.Math_Scorce,pMove->data.Chinese_Scorce);
		printf("查找成功\n");
		return ;
	}
}

//以学号来进行排序
void Rank_ID_List(Lnode* Head_Node)
{
	Lnode *p,*q,*tail;
	tail = NULL;

	if(Head_Node->next == NULL)
	{
		printf("插入错误!!!\n");
		return ;
	}
	else
	{
		while((Head_Node->next->next) != tail)
		{
			p = Head_Node;
			q = Head_Node->next;
			while(q->next != tail)
			{
				if((q->data.ID) > (q->next->data.ID))
				{
					p->next = q->next;
					q->next = q->next->next;
					p->next->next = q;
					q = p->next;
				}
				q = q->next;
				p = p->next;
			}
			tail = q;
		}
	}

}

//以数学成绩来进行排序
void Rank_Math_Scorce_List(Lnode* Head_Node)
{
	Lnode *p,*q,*tail;
	tail = NULL;

	if(Head_Node->next == NULL)
	{
		printf("插入错误!!!\n");
		return ;
	}
	else
	{
		while((Head_Node->next->next) != tail)
		{
			p = Head_Node;
			q = Head_Node->next;
			while(q->next != tail)
			{
				if((q->data.Math_Scorce) > (q->next->data.Math_Scorce))
				{
					p->next = q->next;
					q->next = q->next->next;
					p->next->next = q;
					q = p->next;
				}
				q = q->next;
				p = p->next;
			}
			tail = q;
		}
	}

}

void Menu()
{
	printf("\n\t**************************************\n");
	printf("\t*      欢迎使用学生管理系统          *\n");
	printf("\t*\t0:输入学生信息               *\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");
	printf("\t*\t9:退出系统		     *\n");
	printf("\t*  说明:输入性别时,1:男 0:女        *\n");
	printf("\t**************************************\n");
}

int main()
{
	int select;
	char key;
    Lnode* Head_Node = Create_Head_Node();
    Node_Data temp,inster_temp;
	
	Menu();
	printf("请输入你的选择:");
	
	while(1)
	{
		scanf("%d",&select);
		switch(select)
		{
			case 0: printf("请输入学生的学号、性别、数学、语文:");scanf("%d%d%d%d",&temp.ID,&temp.sex,&temp.Math_Scorce,&temp.Chinese_Scorce); Insert_Data_List(Head_Node,temp);break;
			case 1: printf("学号\t性别\t数学\t语文\n"); Printf_List(Head_Node); break;
			case 2: printf("请输入查询学生的学号:");scanf("%d",&temp.ID);Find_CertainValue_List(Head_Node,temp); break;
			case 3: printf("请输入插入在哪个学生后面:");scanf("%d",&temp.ID);printf("\n请输入学生的学号、性别、数学、语文:");scanf("%d%d%d%d",&temp.ID,&temp.sex,&temp.Math_Scorce,&temp.Chinese_Scorce);Inster_PostionRear_List(Head_Node,temp,inster_temp); break;
			case 4: printf("请输入待删除学生的学号:");scanf("%d",&temp.ID);Delete_AccordValue_List(Head_Node,temp);break;
			case 5: Rank_ID_List(Head_Node); break;
			case 6: Rank_Math_Scorce_List(Head_Node); break;
			case 7: Menu();break;
			case 8: system("clear");break;
			case 9: printf("你已退出学生管理系统!!!!\n"); return 0; break;
			default: printf("输入错误\n");break;
		}
		
		printf("\n是否继续(y/n):");
		setbuf(stdin,NULL);
		scanf("%c",&key);
		if(key == 'N' || key == 'n')
			break;
		printf("请输入你的选择:");

	}
	printf("你已退出学生管理系统!!!!\n");
    return 0;
}

有错误的地方请指出来,我们一起进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点灯大师~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值