学生管理系统(链表)-C语言

//学生信息管理系统
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct score
{
	int score_c;    //C语言成绩
	int score_math; //高等数学
	int score_english;//英语成绩 
}Score;
typedef struct Student
{
	char name[100];  //姓名 
	char num[100];   //学号 
	char sex;		 //性别(m代表男,f代表女) 
	int age;        //年龄 
	Score score;	 //成绩 
}stu;
typedef struct node
{
	stu data;
	struct node *next;
}LinkList;

void menu();
void help();
void next();
LinkList *InitLink(LinkList *L);
void InitLink1(LinkList **L);
void InsertLink(LinkList *L, LinkList *p);
void InsertLink1(LinkList *L, LinkList *p); 
void add_student(LinkList *L);
void display(LinkList *L);
void deleted(LinkList *L);
void find_student(LinkList *L);
void update_student(LinkList *L);
void save_student(LinkList *L);
void read_student(LinkList *L);
void sort(LinkList *L);
int main()
{
	LinkList *head;
	InitLink1(&head);
//	head = InitLink(head);
	read_student(head);
	int choose;
	while(1)
	{
		menu();
		printf("\n请输入你的选择:");
		scanf("%d", &choose);
		switch(choose)
		{
			case 1:  help();              break;
			case 2:  sort(head);          break;
			case 3:  find_student(head);  break;
			case 4:  update_student(head);break;
			case 5:  add_student(head);   break;
			case 6:  deleted(head);       break;
			case 7:  display(head);       break;
			case 8:  save_student(head);  break;
			case 9:  exit(0);             break;
			default: next;              break;
		}
	}
}
void menu()          //显示菜单 
{
	system("cls");
	printf("\n");
	printf("********************************************************************************************\n");
	printf("*                                     学生信息管理系统                                     *\n");
	printf("********************************************************************************************\n");
	printf("****************************************系统功能菜单****************************************\n");
	printf("--------------------------------------------------------------------------------------------\n");
	printf("********************************************************************************************\n");
	printf("****           1、使用帮助                  ****               2、刷新学生信息-学号排序 ****\n");
	printf("********************************************************************************************\n");
	printf("****           3、查询学生信息              ****               4、修改学生信息          ****\n");
	printf("********************************************************************************************\n");
	printf("****           5、增加学生信息              ****               6、删除(学号)学生信息    ****\n");
	printf("********************************************************************************************\n");
	printf("****           7、显示所有学生信息          ****               8、保存当前学生信息      ****\n");
	printf("********************************************************************************************\n");
	printf("****           9、退出系统                  ****            ====》待开发模块《====      ****\n");
	printf("********************************************************************************************\n");
	printf("--------------------------------------------------------------------------------------------\n");
}
//使用帮助 
void help()
{
	system("cls");
	printf("\n          这是一个学生管理系统,为方便您更快了解它,请先阅读以下注意事项:                \n");
    printf("\n                                        注意事项:                                         \n");
    printf("\n               1、请根据提示进行操作!                                                    \n");
    printf("\n               2、初次使用请先选择增加学生信息!                                          \n");
    printf("\n               3、修改或者增加学生信息后切记保存!                                        \n");
    printf("\n               4、如果数据有错误,请先修改再保存!                                        \n");
    printf("\n               5、若您之前使用过,下次进入系统请先刷新学生信息!                          \n");
    printf("\n               6、在添加学生时,用两个字符代表不同的性别,比如男用‘M’代替,女用‘W’代替!\n");
    printf("\n               7、保存或者刷新时,输入的文件名后缀请使用.txt,比如: stu.txt,系统会在源程序\n");
    printf("\n                  “学生管理系统.exe”的相同目录建立一个.txt文件来保存学生信息,您可以查看\n");
    printf("\n                  该文件,但非专业人员不要轻易改动,否则会造成刷新数据异常或刷新失败!    \n");
    printf("\n               8、学生信息包括:姓名、学号、性别、年龄、C语言成绩、高数成绩、英语成绩等! \n");
    printf("\n               9、使用遇到任何问题请与我们联系,电话:110、119、120\n");
    printf("\n              10、最后感谢您的使用!                                                      \n");
    system("pause");    //让系统暂停
}
//待开发模块 
void next()
{
	system("cls");
	printf("\n");
	printf("********************************************************************************************\n");
	printf("****                               ====》此模块待开发《====                             ****\n");
	printf("********************************************************************************************\n");
	system("pause");    //让系统暂停
}
//申请空间 1、返回一个指针 2、二级指针 3、引用 给变量起别名 拿到原本的东西  
LinkList *InitLink(LinkList *L)
{
	LinkList *tmp = L;
	tmp = (LinkList *)malloc(sizeof(LinkList));
	tmp->next = NULL;
	return tmp;
}
void InitLink1(LinkList **L)
{
//	LinkList *tmp = L;
	*L = (LinkList *)malloc(sizeof(LinkList));
	(*L)->next = NULL;
}
//在头节点后插入一个节点 
void InsertLink(LinkList *L, LinkList *p)
{
	LinkList *tmp = L;
	p->next = tmp->next;
	tmp->next = p;
}
void InsertLink1(LinkList *L, LinkList *p)
{
	p->next = L->next;
	L->next = p;
}
//增加学生信息
void add_student(LinkList *L)
{
	char Sno[20];
	char s;
	Score sc; 
	LinkList *tmp = L->next;
	printf("请输入学生的信息:\n");
	printf("\n学号:");
	scanf("%s", Sno);
	while(tmp != NULL)
	{
		if(strcmp(tmp->data.num, Sno) == 0)
		{
			printf("该学生已存在!!!");
			break; 
		}
		tmp = tmp->next;
	}
	if(tmp == NULL)
	{
		LinkList *mmp;
		mmp = InitLink(mmp);
		strcpy(mmp->data.num, Sno);
		printf("\n姓名:");
		scanf("%s", &mmp->data.name);
		printf("\n性别(m为男,f为女):");
		getchar();
		scanf("%c", &s);
		mmp->data.sex = s;
		printf("\n年龄:");
		fflush (stdin);
		scanf("%d", &(mmp->data.age));
		printf("\nC语言成绩:");
		fflush (stdin);
		scanf("%d", &sc.score_c);
		while(sc.score_c < 0 || sc.score_c > 100)
		{
			printf("\n输入1有误,请重新输入:");
			fflush (stdin);
			scanf("%d", &sc.score_c);
		}
		mmp->data.score.score_c = sc.score_c;
		printf("\n高数成绩:");
		fflush (stdin);
		scanf("%d", &sc.score_math);
		while(sc.score_math < 0 || sc.score_math > 100)
		{
			printf("\n输入2有误,请重新输入:");
			fflush (stdin);
			scanf("%d", &sc.score_math);
		}
		mmp->data.score.score_math = sc.score_math;
		printf("\n英语成绩:");
		fflush (stdin);
		scanf("%d", &sc.score_english);
		while(sc.score_english < 0 || sc.score_english > 100)
		{
			printf("\n输入3有误,请重新输入:");
			fflush (stdin);
			scanf("%d", &sc.score_english);
		}
		mmp->data.score.score_english = sc.score_english;
		InsertLink(L, mmp);
	}
	system("pause");
}
//显示所有学生
void display(LinkList *L)
{
	LinkList *tmp = L->next;
	if(tmp == NULL)
	{
		printf("目前还未添加学生信息!!!\n");
		system("pause");
		return ; 
	}
	while(tmp != NULL)
	{
		printf("姓名:%s\t", tmp->data.name);  
        printf("学号:%s\t", tmp->data.num);  
        printf("性别:%c\t", tmp->data.sex);  
        printf("年龄:%d\t", tmp->data.age);  
        printf("c语言成绩:%d\t", tmp->data.score.score_c); 
  		printf("高等数学成绩:%d\t", tmp->data.score.score_math); 
  		printf("大学英语成绩:%d\n", tmp->data.score.score_english);
		tmp = tmp->next;
	}
	system("pause");
} 
//删除(学号)学生信息
void deleted(LinkList *L)
{
	LinkList *tmp = L->next;
	LinkList *mmp = L;
	int flag = 0;
	char Sno[20];
	if(tmp == NULL)
	{
		printf("数据表为空,请添加学生!!\n");
		system("pause");
		return ; 
	}
	printf("\n请输入您要删除的学生的学号:"); 
	fflush(stdin);
	gets(Sno);
	while(tmp)
	{
		if(strcmp(tmp->data.num, Sno) == 0)
		{
			mmp->next = tmp->next;
			free(tmp);  //删除了以后 进行内存的释放 
			printf("删除学生成功!!!\n");
			flag = 1;
			break; 
		}
		mmp = tmp;
		tmp = tmp->next;
	}
	if(flag == 0)
		printf("这个学生不存在!!!\n");
	system("pause");
}
//查询学生信息
void find_student(LinkList *L)
{
	int flag;
	char Sno[20], named[20];
	LinkList *tmp = L->next;
	if(tmp == NULL)
	{
		printf("还没有学生,请添加!!!\n");
		system("pause");
		return ; 
	}
	printf("********************************************************************************************\n");
	printf("****           1、按学号查找                ****               2、按姓名查找            ****\n");
	printf("********************************************************************************************\n");
	printf("\n请输入查找方式:");
	scanf("%d", &flag);
	if(flag == 1)
	{
		printf("\n请输入您要查询的学生的学号:"); 
		fflush(stdin);
		gets(Sno);
		while(tmp)
		{
			if(strcmp(tmp->data.num, Sno) == 0)
			{
				printf("姓名:%s\n", tmp->data.name);  
                printf("学号:%s\n", tmp->data.num);  
                printf("性别:%c\n", tmp->data.sex);  
                printf("年龄:%d\n", tmp->data.age);  
                printf("c语言成绩:%d\n", tmp->data.score.score_c); 
    			printf("高等数学成绩:%d\n", tmp->data.score.score_math); 
    			printf("大学英语成绩:%d\n", tmp->data.score.score_english);
    			system("pause");
				return ; 
			}
			tmp = tmp->next;
		}
		if(tmp == NULL)
			printf("查无此人!!!"); 
	}
	else
	{
		printf("\n请输入您要查询的学生的姓名:"); 
		fflush(stdin);
		gets(named);
		while(tmp)
		{
			if(strcmp(tmp->data.name, named) == 0)
			{
				printf("姓名:%s\n", tmp->data.name);  
                printf("学号:%s\n", tmp->data.num);  
                printf("性别:%c\n", tmp->data.sex);  
                printf("年龄:%d\n", tmp->data.age);  
                printf("c语言成绩:%d\n", tmp->data.score.score_c); 
    			printf("高等数学成绩:%d\n", tmp->data.score.score_math); 
    			printf("大学英语成绩:%d\n", tmp->data.score.score_english);
    			system("pause");
				return ; 
			}
			tmp = tmp->next;
		}
		if(tmp == NULL)
			printf("查无此人!!!"); 
	}
}
//修改学生信息
void update_student(LinkList *L)
{
	char Sno[20];
	LinkList *tmp = L->next;
	Score sc;
	if(tmp == NULL)
	{
		printf("无学生,请先添加学生!!");
		system("pause");
		return ;
	}
	printf("\n请输入要更新学生的学号:");
	scanf("%s", Sno);
	while(tmp != NULL)
	{
		if(strcmp(tmp->data.num, Sno) == 0)
		{
			printf("请输入您要修改的信息选项:1.姓名 2. 成绩(c语言,高等数学,大学英语)  3.年龄   \n");  
            int label;  
            scanf("%d", &label); 
            switch(label)
            {
            	case 1:
            		printf("\n请输入要修改的姓名:");
            		scanf("%s", &tmp->data.name);
            		break;
            	case 2:
            		printf("\n请输入要修改的成绩:");
            		scanf("%d %d %d", sc.score_c, sc.score_math, sc.score_english);
            		tmp->data.score = sc;
            		break;
            	case 3:
            		printf("\n请输入要修改的年龄:");
					scanf("%d", &(tmp->data.age));
            		break;
			}
		}
		tmp = tmp->next;
	}
	printf("修改成功!!!"); 
	system("pause");
	
}
//保存学生信息
void save_student(LinkList *L)
{
	FILE *fp;
	LinkList *tmp = L->next;
	if(tmp == NULL)
	{
		printf("无学生,请先添加学生!!");
		system("pause");
		return ;
	}
	if((fp = fopen("student.txt", "w")) == NULL)
	{
		printf("不能打开此文件,请按任意见退出\n");
		exit(1);
	}
//	fprintf(fp,"学号\t姓名\t性别\t年龄\tC成绩\t数学成绩\t英语成绩\n");
	while(tmp)
	{
		fprintf(fp,"%s\t%s\t%c\t%d\t%d\t%d\t%d \n", tmp->data.num, tmp->data.name, tmp->data.sex, 
		tmp->data.age, tmp->data.score.score_c, tmp->data.score.score_math, tmp->data.score.score_english);  
        tmp = tmp->next;   	
	}
	printf("保存成功\n");
	fclose(fp);
	system("pause");
}
//读取预置文件 
void read_student(LinkList *L)
{
	FILE *fp;
	int i = 1;
	fp = fopen("student.txt", "rb");
	if(fp == NULL)
	{
		printf("没有需要加载的文件或文件不存在!!!");
		return ;
	}
	while(!feof(fp))
	{	
		LinkList *tmp = (LinkList *)malloc(sizeof(LinkList));
		tmp->next = NULL;
		fscanf(fp,"%s\t%s\t%c\t%d\t%d\t%d\t%d \n", &tmp->data.num, &tmp->data.name, &tmp->data.sex, 
		&tmp->data.age, &tmp->data.score.score_c, &tmp->data.score.score_math, &tmp->data.score.score_english);
		InsertLink(L, tmp);
	}
	fclose(fp);
}
//选择排序 
//================注意===================// 
void sort(LinkList *L)//按学号排序排序 并输出排序后的结果  
{   
    LinkList *q, *p, *r = L->next;  
    //判断  
    int i = 0;
    if(r == NULL)  
    {  
        printf("还没有学生信息,请增加学生信息\n");  
        return;  
    }  
    while(r->next != NULL) //两层循环完成排序  
    {  
         p = r;  
         q = r->next;  
         LinkList *tmp;    //用于排序时暂存节点  
         tmp = InitLink(tmp);  
         while(q)  
         {  
         	 if(atoi(q->data.num) < atoi(p->data.num))  //atoi将字符串转换成数字 学号由小到大
//             if(q->data.age < p->data.age)  //年龄由小到大
             {  
             	printf("%d\n", i);
                /*先复制q结点信息到tmp*/  
                strcpy(tmp->data.num, q->data.num);  
                strcpy(tmp->data.name, q->data.name);  
                tmp->data.sex = q->data.sex;  
                tmp->data.age = q->data.age;  
                tmp->data.score = q->data.score; 
				/*再复制p结点信息到q*/  
                strcpy(q->data.num , p->data.num);  
                strcpy(q->data.name , p->data.name);  
                q->data.sex = p->data.sex;  
                q->data.age = p->data.age;  
                q->data.score = p->data.score;
				/*最后复制exchange结点信息到p*/  
                strcpy(p->data.num, tmp->data.num);  
                strcpy(p->data.name, tmp->data.name);  
                p->data.sex = tmp->data.sex;  
                p->data.age = tmp->data.age;  
                p->data.score = tmp->data.score;  
                i++;
             }  
             q = q->next;  
         }  
         r = r->next; 
    }
	printf("刷新后的学生信息是:\n");  
    display(L);  
}  
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
学习【数据结构课程】中线性表知识,自己动手做的【学生信息 管理 系统】。 目的:重在功能实现,思考探索。 编程语言:C IDE:VC++6.0 基础功能:增、删、查、改。 【扩展功能: 1.数据的保存、读取; 2.账号的登入、登出; 3.对数据敏感操作的日志记录; 4.对查询结果的简单数量统计。】 缺陷:没有排序功能,统计能不够强大,对非法或刁难的数据处理效果微弱。 (感兴趣的朋友可以试着填补上述缺陷) 【水平有限,代码仅作参考。 有不足之处,还望指出,非常感谢。】 附录: 1.学生信息 类型: typedef struct { char id[11]; /*学号,12入学年份,34学院,56专业,78班级,90班内号数*/ char name[11]; /*姓名,仅考虑由字母组成的名字*/ int sex; /*性别,男1,女0*/ char headTeacher[11]; /*班主任*/ int entranceScore; /*入学成绩*/ char birthday[9]; /*xxxx年xx月xx日*/ char Tel[12]; /*联系电话,11位*/ char homeAddress[21]; /*家庭地址*/ } stuData; 2.文件目录: head.c linklist.c linkqueue.c list.txt log.c logData.txt login.c main.c stu.c stuData.txt user.c userData.txt 基础:C语言知识,特别强调:指针和链表的知识.txt 学生信息系统_流程图_粗糙.png 提示:阅读代码可以从head.c或main.c开始;运行程序从main.c开始,登陆账号在userData.txt中设置.txt 效果图1_登陆账号.png 效果图2_登陆账号2.png 效果图3_功能选择.png 效果图4_浏览学生信息.png 效果图5_查询学生信息.png 效果图6_退出查询学生信息.png 效果图7_退出账号.png 效果图8_退出系统.png 【完毕】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

脆订壳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值