【C语言】(结构链表)学生信息管理系统

学生信息管理系统

  • 壹、介绍
  • 思路
  • 贰、代码分布
    • 一、头文件,定义结构链表
    • 二、菜单栏
    • 三、不同函数实现不同功能
      • 1、录入信息
      • 2、查看信息
      • 3、保存信息
      • 4、读取信息
      • 5、查找成年学生
      • 6、查找男or女学生
      • 7、学生人数
      • 8、修改学生信息
      • 9、删除学生信息
      • 10、主函数
  • 叁、所有代码

壹、介绍

创建一个学生结构体,学生的属性的有sno,sname,ssex,sage(分别是学号,姓名,性别,年龄),创建一个指针链表,用来存放学生,中存放不少于五个学生,要求性别有区分,年龄有区分,使用函数,打印性别为不同性别的学生信息;打印年龄>18的学生信息,有学生数量,有修改,删除学生信息的功能。
要求有文件流,可以存储和读区数据

思路

首先考虑到代码的需要实现的功能有功能很多,用户对功能的使用顺序不一定固定,所以考虑在主函数中用到switch-case实现对不同函数跟据用户需求的调用,进而在程序开始运行是加入菜单选项,在逐步完善不同函数实现不同的功能,一个函数对应不同的功能,方便后期修改,与阅读。

贰、代码分布

一、头文件,定义结构链表

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _student{		//定义学生结构体
	char name[6];
	int sno;
	int ssex;
	int sage;
}student;

typedef struct _Node{		
	student stu1;
	struct _Node* pNext;
}Node;

Node *g_head=NULL;

二、菜单栏

通过不同数字按键实现不同调用。

void menu(){
	printf("------------\n");
	printf("- 1录入信息-\n");
	printf("- 2查看信息-\n");
	printf("- 3保存信息-\n");
	printf("- 4读取信息-\n");
	printf("- 5查找成年学生-\n");
	printf("- 6查找男or女学生-\n");
	printf("- 7查看学生人数-\n");
	printf("- 8修改学生信息-\n");
	printf("- 9删除学生信息-\n");
	printf("- 0退出-\n");
	printf("退出不要直接点×,请按0退出\n 查看文件前请先读取文件\n"); 
	
}

三、不同函数实现不同功能

1、录入信息

//录入信息
void input(){
	printf("请输入学生信息\t\n");
	Node *pNewNode=(Node*)malloc(sizeof(Node));		//创建一个新节点
	pNewNode->pNext=NULL;
	
	if(g_head==NULL){
		g_head=pNewNode;
	}
	else{
		pNewNode->pNext=g_head;
		g_head=pNewNode;
	}
	printf("请输入姓名:");
	scanf("%s",pNewNode->stu1.name);
	printf("请输入学号:");
	scanf("%d",&pNewNode->stu1.sno);
	printf("1表示男,0表示女\n");
	printf("请输入性别:");		//0表示女,1表示男
	scanf("%d",&pNewNode->stu1.ssex);
	printf("请输入年龄:");
	scanf("%d",&pNewNode->stu1.sage);	
	
	printf("该学生信息输入完毕!\n\n");	 
}

2、查看信息

用指针打印所有学生信息。

//查看信息
void printdate(){
	Node* p=g_head;
	printf("\t姓名\t学号\t性别\t年龄\n");
	while(p !=NULL){
		printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
		p = p->pNext; 
	}
}

3、保存信息

//保存信息
void save(){
	
	FILE *fp=fopen("D:\\stu.date","w");		//写入文件
	if(fp==NULL){
		printf("打开文件失败\n");
		return; 
	}
	Node* p=g_head;
	while(p!=NULL){
		fwrite(&p->stu1,1,sizeof(student),fp);
		p=p->pNext;
		printf("文件保存成功!\n");
	}
	fclose(fp);

}

4、读取信息

/读取信息
void rs(){
	FILE* fp=fopen("D:\\stu.data","r");
	if(fp==NULL){
		printf("打开文件失败\n");
	}else{
	printf("文件读取成功!\n查看文件请按2\n");
	}	
	student stu;
	
	while(fread(&stu,1,sizeof(student),fp)){
		Node* pNewNode=(Node*)malloc(sizeof(Node));
		pNewNode->pNext=NULL;
		
		memcpy(pNewNode,&stu,sizeof(student));
		
		if(g_head==NULL){
			g_head=pNewNode;
		}
		else{
			pNewNode->pNext=g_head;
			g_head=pNewNode;
		}
	}
}

5、查找成年学生

void find_age(){
	int flag;
	Node* p=g_head;
	while(p!=NULL){
		if(p->stu1.sage>17){
			printf("\t姓名\t学号\t性别\t年龄\n");
			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
			flag++;
		}
		p=p->pNext;
	}
	if(flag == 0){
		printf("have no");
	}
}

6、查找男or女学生

void find_sex(){
	int sex;
	int i;
	printf("1表示男,0表示女\n请输入性别: \n");
	scanf("%d",&sex);
	Node* p=g_head;
	while(p!=NULL){
		if(p->stu1.ssex==sex){
			printf("\t姓名\t学号\t性别\t年龄\n");
			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
			i++;
		}
		p=p->pNext;
	}
	if(i == 0){
		printf("have not");
	}
}

7、学生人数

void count(){
	int a=0;
	FILE* fp=fopen("D:\\stu.data","r");
	if(fp==NULL){
		printf("文件打开失败");
		return;
	}
	Node* p=g_head;
	while(p!=NULL){
		p=p->pNext;
		a++;
	}
	printf("总人数:%d",a);
}

8、修改学生信息

输入num,通过if函数判断,结构中学号sno与num相等,再重新写入该学生的信息

void change(){
	int num;
	printf("请输入要修改的学生的学号: ");
	scanf("%d",&num);
	Node* p=g_head;
	while(p!=NULL){

		if(p->stu1.sno==num){
			printf("请输入姓名: \n");
			scanf("%s",p->stu1.name);
			printf("请输入年龄: \n");
			scanf("%d",&p->stu1.sage);
			printf("请输入学号: \n");
			scanf("%d",&p->stu1.sno);
			printf("请输入性别: \n");
			scanf("%d",&p->stu1.ssex);
			printf("信息更改完毕!");
		}

		p=p->pNext;
	}
	if(p==NULL){
		printf("该学生不存在!\n");
	}

}

9、删除学生信息

用num找到对应的结构,再将指针指向下一个学生结构

void del(){
	int num;

	printf("请输入要删除的学号");
	scanf("%d",&num);
	Node* p=g_head;
	Node*p1,*p2;
	if(p->stu1.sno==num){
		p1=p->pNext;

		free(p1);

	}
	if(p->pNext!=NULL){
		p2=p->pNext;
		p->pNext=p->pNext->pNext;
		free(p2);
	}
printf("学号为%d的信息删除成功!\n",num);

}

10、主函数

用switch-case函数实现不同功能的调用

int main()
{
	menu();
	while(1)
	{
		char ch=getch();
		switch(ch){
		case '1':input();break;		
		case '2':printdate();break;
		case '3':save();break;
		case '4':rs();break;		
		case '5':find_age();break;
		case '6':find_sex();break;
		case '7':count();break;
		case '8':change();break;
		case '9':del();break; 
		case '0':exit(0);		
		}
	}

return 0;
}

叁、所有代码

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>

typedef struct _student{
	char name[6];
	int sno;
	int ssex;
	int sage;
}student;

typedef struct _Node{
	student stu1;
	struct _Node* pNext;
}Node;

Node *g_head=NULL;

void menu(){
	printf("------------\n");
	printf("- 1录入信息-\n");
	printf("- 2查看信息-\n");
	printf("- 3保存信息-\n");
	printf("- 4读取信息-\n");
	printf("- 5查找成年学生-\n");
	printf("- 6查找男or女学生-\n");
	printf("- 7查看学生人数-\n");
	printf("- 8修改学生信息-\n");
	printf("- 9删除学生信息-\n");
	printf("- 0退出-\n");
	printf("退出不要直接点×,请按0退出\n 查看文件前请先读取文件\n"); 
	
}

//录入信息
void input(){
	printf("请输入学生信息\t\n");
	Node *pNewNode=(Node*)malloc(sizeof(Node));		//创建一个新节点
	pNewNode->pNext=NULL;
	
	if(g_head==NULL){
		g_head=pNewNode;
	}
	else{
		pNewNode->pNext=g_head;
		g_head=pNewNode;
	}
	printf("请输入姓名:");
	scanf("%s",pNewNode->stu1.name);
	printf("请输入学号:");
	scanf("%d",&pNewNode->stu1.sno);
	printf("1表示男,0表示女\n");
	printf("请输入性别:");		//0表示女,1表示男
	scanf("%d",&pNewNode->stu1.ssex);
	printf("请输入年龄:");
	scanf("%d",&pNewNode->stu1.sage);	
	
	printf("该学生信息输入完毕!\n\n");	 
}

//查看信息
void printdate(){
	Node* p=g_head;
	printf("\t姓名\t学号\t性别\t年龄\n");
	while(p !=NULL){
		printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
		p = p->pNext; 
	}
}

//保存信息
void save(){
	
	FILE *fp=fopen("D:\\stu.date","w");
	if(fp==NULL){
		printf("打开文件失败\n");
		return; 
	}
	Node* p=g_head;
	while(p!=NULL){
		fwrite(&p->stu1,1,sizeof(student),fp);
		p=p->pNext;
		printf("文件保存成功!\n");
	}
	fclose(fp);

}

//读取信息
void rs(){
	FILE* fp=fopen("D:\\stu.data","r");
	if(fp==NULL){
		printf("打开文件失败\n");
	}else{
	printf("文件读取成功!\n查看文件请按2\n");
	}	
	student stu;
	
	while(fread(&stu,1,sizeof(student),fp)){
		Node* pNewNode=(Node*)malloc(sizeof(Node));
		pNewNode->pNext=NULL;
		
		memcpy(pNewNode,&stu,sizeof(student));
		
		if(g_head==NULL){
			g_head=pNewNode;
		}
		else{
			pNewNode->pNext=g_head;
			g_head=pNewNode;
		}
	}
}

void find_age(){
	int flag;
	Node* p=g_head;
	while(p!=NULL){
		if(p->stu1.sage>17){
			printf("\t姓名\t学号\t性别\t年龄\n");
			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
			flag++;
		}
		p=p->pNext;
	}
	if(flag == 0){
		printf("have no");
	}
}

void find_sex(){
	int sex;
	int i;
	printf("1表示男,0表示女\n请输入性别: \n");
	scanf("%d",&sex);
	Node* p=g_head;
	while(p!=NULL){
		if(p->stu1.ssex==sex){
			printf("\t姓名\t学号\t性别\t年龄\n");
			printf("\t%s\t,%d\t,%d\t,%d\t\n",p->stu1.name,p->stu1.sno,p->stu1.ssex,p->stu1.sage);
			i++;
		}
		p=p->pNext;
	}
	if(i == 0){
		printf("have not");
	}
}

void count(){
	int a=0;
	FILE* fp=fopen("D:\\stu.data","r");
	if(fp==NULL){
		printf("文件打开失败");
		return;
	}
	Node* p=g_head;
	while(p!=NULL){
		p=p->pNext;
		a++;
	}
	printf("总人数:%d",a);
}

void change(){
	int num;
	printf("请输入要修改的学生的学号: ");
	scanf("%d",&num);
	Node* p=g_head;
	while(p!=NULL){

		if(p->stu1.sno==num){
			printf("请输入姓名: \n");
			scanf("%s",p->stu1.name);
			printf("请输入年龄: \n");
			scanf("%d",&p->stu1.sage);
			printf("请输入学号: \n");
			scanf("%d",&p->stu1.sno);
			printf("请输入性别: \n");
			scanf("%d",&p->stu1.ssex);
			printf("信息更改完毕!");
		}

		p=p->pNext;
	}
	if(p==NULL){
		printf("该学生不存在!\n");
	}

}



void del(){
	int num;

	printf("请输入要删除的学号");
	scanf("%d",&num);
	Node* p=g_head;
	Node*p1,*p2;
	if(p->stu1.sno==num){
		p1=p->pNext;

		free(p1);

	}
	if(p->pNext!=NULL){
		p2=p->pNext;
		p->pNext=p->pNext->pNext;
		free(p2);
	}
printf("学号为%d的信息删除成功!\n",num);

}

int main()
{
	menu();
	while(1)
	{
		char ch=getch();
		switch(ch){
		case '1':input();break;		
		case '2':printdate();break;
		case '3':save();break;
		case '4':rs();break;		
		case '5':find_age();break;
		case '6':find_sex();break;
		case '7':count();break;
		case '8':change();break;
		case '9':del();break; 
		case '0':exit(0);		
		}
	}

return 0;
}

版权声明:本文为博主作者:卷卷的aJun原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/m0_73223545/article/details/129263166

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2024年1月3日
下一篇 2024年1月3日

相关推荐