学生信息管理系统(C语言 单链表实现)


好久没更新了,这段都在写学生信息管理系统QAQ

在这里插入图片描述

程序描述

这个学生管理系统只用到了一个链表,在功能一录入信息时建立链表。没有用到结构体数组。
在这里插入图片描述
主函数为菜单页,通过输入调用其他函数,每个函数对应一个功能。函数调用完会回到主函数。通过清屏来实现界面的跳转,每次清屏顺便清理一下缓存区。
在这里插入图片描述

注意!!!此程序包含一些输入的容错(把所有数据设置为字符数组,通过调用容错函数检查这个字符数组是不是纯数字、或者包含汉字等)还有很多不足的地方,我写的这个只能作于参考。

用到的函数与结构体

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define LEN sizeof(struct student)
struct student
{
   
	char num[20];//学号  
	char name[20];//姓名
	char sex[20];//性别
	char room[20];//宿舍号码
	char tel[20];//电话号码
	
	char CHN[20];//语文 
	char MATH[20];//数学 
	char ENG[20];//英语 
	char PE[20];//体育 
	char PRO[20];//专业 
	char average_score[20];//平均分
	
	struct student *next; 
};
int n;//节点数 
 
struct student *creat();//信息录入 
void score(struct student *head);//成绩录入 
void findinformation(struct student *head);//信息查询 
void findscore(struct student *head);//成绩查询
struct student *del(struct student *head);//信息删除 
struct student *insert(struct student *head);//信息插入 
void update(struct student *head);//修改分数
void Oscore(struct student*head);//排序输出
void swap(struct student*p1,struct student*p2);//交换数据 
void fenduan(struct student*head);//分段输出
int checknum(char ch[]);//检查纯数字的数据里是否混入了非数字的非法输入
int transformint(char ch[]);//纯数字整数(字符串转向int类型)
void save(struct student *head); //文件存储   
void export1();//文件输出 
struct student *import();//文件导入
int checkscore(char ch[]);//检查分数是否为0-99的纯数字 
int IncludeChinese(char *str); //检查性名、性别是否包含汉字 

主函数部分

int main()
{
   
	struct student *head=NULL;
	char choose[20];
	menu://设置主菜单的点 
	printf("\n");
	printf("\t\t\t\t\t\t【学生管理系统2.0】\t\t\t\t\t\n"); 
    printf("\t\t★————————————————————————————————————————★\n\n");
    printf("\t\t\t   | 1. 信息录入\t\t2. 成绩录入\t\t3. 信息查询  |\n\n");
    printf("\t\t\t   | 4. 成绩查询\t\t5. 删除信息\t\t6. 信息追加  |\n\n");
    printf("\t\t\t   | 7. 更改分数\t\t8. 查看排名\t\t9. 成绩分段  |\n\n");
    printf("\t\t\t   | 10.保存文件\t\t11.文件输出\t\t12.文件导入  |\n\n");
    printf("\t\t★————————————————按0并回车退出——————————————————★\n"); 
    printf("请输入执行数字:");
    while(scanf("%s",choose)&&checknum(choose)==0)//检查到不是纯数字 让用户重新输入 
	{
   
		printf("输入无效,重新输入:"); 
	}
		switch(transformint(choose))
		{
   
			case 1:
			head=creat();
			break;
			case 2:
			score(head);
			break;
			case 3:
			findinformation(head);
			break;
			case 4:
			findscore(head);
			break;
			case 5:
			head=del(head);
			break;
			case 6:
			head=insert(head);
			break;
			case 7:
			update(head);
			break;
			case 8:
			Oscore(head);
			break;
			case 9:
			fenduan(head);
			break;	
			case 10:
			save(head); 
			break;
			case 11:
			export1();
			break;
			case 12:
			head=import();
			break;
		}
		if(transformint(choose)<0||transformint(choose)>12)//输入了不在执行数字范围内的数字返回主菜单的点 
		{
   
			system("cls");//清理屏幕和缓冲区 
    		fflush(stdin);
    		goto menu;
		} 
		if(transformint(choose)!=0)//输入不是0,继续回到主菜单 
		{
   
			goto menu;
		}
	system("cls");//结束时清理屏幕和缓冲区,打印下方的校徽 
    fflush(stdin);
	printf("\n感谢使用!\n");
	printf("\n                                                     *\n");
    printf("                                                *  ***  ****\n");
    printf("                                              *** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                             **** **** **** ****\n");
    printf("                                              **** ******* ****\n");
    printf("                                                *************\n");
    printf("                                                    *****\n");
	system("pause");
	return 0; 
}

校徽有内味了
在这里插入图片描述

1.信息录入

struct student *creat()//录入信息,创建链表 
{
   
	system("cls");
    fflush(stdin);
	printf("*****************************************************信息录入***********************************************************\n");
	printf("依次键入学号、姓名、性别、宿舍号码、电话号码,用一个【空格】隔开各数据,每一条输入完成后按回车键进行下一条输入。         \n");
	printf("                                             【退出请输入'0'并回车】                                                     \n");
	printf("样例:\n541913460230 张三 男 1717 66666\n在此输入:\n"); 
	n=0;
	struct student *head,*p1,*p2;
	head = NULL;
	p1=p2=(struct student*)malloc(LEN);

	while(scanf("%s",p1->num)&&checknum(p1->num)==0)
	{
   
		printf("输入错误的学号,重新输入:\n"); 
	}
	if(transformint(p1->num)==0)//输入了0退出函数调用,传回去表头指针head给主函数的head 
	{
   
		system("cls");
    	fflush(stdin);
		return(head);
	} 
	while(scanf("%s",p1->name)&&IncludeChinese(p1->name)==0)//这几行while(scanf)都是具有容错的输入,整个程序中都存在输入容错!!! 
	{
   															
		printf("输入错误的名字,重新输入:\n"); 
	}
	while(scanf("%s",p1->sex)&&IncludeChinese(p1->sex)==0)
	{
   
		printf("输入错误的性别,重新输入:\n"); 
	}
	while(scanf("%s",p1->room)&&checknum(p1->room)==0)
	{
   
		printf("输入错误的宿舍号码,重新输入:\n"); 
	}
	while(scanf("%s",p1->tel)&&checknum(p1->tel)==0)
	{
   
		printf("输入错误的手机号码,重新输入:\n"); 
	}
	printf("\n"); 
	while(transformint(p1->num)!=0)//输入每个节点的学号不是0的时候开始循环。 
	{
   
		n+=1;//节点+1 
		if(n==1)				//PS:此处为建立链表常规过程(参考了谭浩强C程序设计第九章链表,红皮那本) 
		{
   
			head=p1;//第一个节点 表头指向上面开辟的第一个节点 p1 p2 head都指向此处此时 
		}else
		{
   
			p2->next=p1;//后面的节点,p2的next指向p1将两个节点连接到一起 
			p2=p1;//p2再跟p1 
		}
		p1=(struct student*)malloc(LEN);
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值