C语言学生信息管理系统

C语言学生信息管理系统

此系统主要通过链表实现学生信息的增删查改。

目录

1.定义结构体

 2.新增学生信息

3.查找学生信息

(1)打印所有学生信息

 (2)按照姓名查找学生

(3)按照性别查找

(4)按照学号查找

4.添加新的学生信息

5.按照学生成绩排序

6.修改学生信息

(1)打印出修改前此学生的信息

(2)修改姓名

(3)修改学号

(4)修改全部信息

7.删除学生信息

8.保存学生信息

9.主函数

10.演示


1.定义结构体

定义一个结构体,里面包括学生的姓名、年龄、专业、学号、成绩,另外包括一个结构体指针。结构体指针用来存放下一个结点的地址,连接链表。

typedef struct student { 
	char name[20];//姓名
	int age;//年龄
	char sex[20] ;//性别
	char major[20];//专业
	char id[20];//学号
	int score;//成绩
	struct student *next;//结构体指针
} stu;

 

 2.新增学生信息

通过一个for循环控制录入的学生信息个数。每新增一个学生信息都会开辟一块新空间,将信息录入,并通过尾插法接入链表。

void add(stu *head) {
	system("cls");
	stu *p=head;
	stu *q;
	int a;
	printf("请输入你想新增几个学生信息:\n");
	scanf("%d",&a);
	int c=0;
	for(int n=0; n<a; n++) {
		stu *p1=(stu*)malloc(sizeof(stu));
		c++;
		printf("请输入第%d个学生的信息\n",c);
		printf("请输入学生姓名:\n");
		scanf("%s",&p1->name );
		printf("请输入学生年龄:\n");
		scanf("%d",&p1->age );
		while(p1->age <0) {                                  //判断年龄是否小于0
			printf("请检查是否输入错误,请重新输入!\n");
			scanf("%d",&p1->age );
		}
		printf("请输入学生性别:\n");
		scanf("%s",&p1->sex );
		while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) { //判断性别是否为男女
			printf("输入格式有误,请重新输入: (输入男或女!)\n");
			scanf("%s",&p1->sex );
		}
		printf("请输入学生专业:\n");
		scanf("%s",&p1->major );
		printf("请输入学生学号:\n");
		scanf("%s",&p1->id );
		q=head;
		while(q->next !=NULL) {                           //判断录入的学号是否重复
			q=q->next ;
			while(strcmp(p1->id ,q->id)==0) {
				printf("该学号已存在,请重新输入!\n");
				scanf("%s",&p1->id);
			}

		}
		printf("请输入学生成绩:\n");
		scanf("%d",&p1->score );
		while(p1->score < 0) {                             //判断成绩是否小于0
			printf("请检查是否输入错误,请重新输入!\n");
			scanf("%d",&p1->score );
		}
		p->next=p1;                                        //尾插法
		p=p->next;
		p->next=NULL;
		printf("添加成功!!\n");
		printf("\n");
	}
	p->next=NULL;
	printf("\n创建完毕!\n");
	system("pause");
	return;
}

3.查找学生信息

查找学生信息可以通过姓名、学号、性别查找,或打印出所有学生信息。

void find(stu *head) {
	printf("查看所有学生信息请按1\n");
	printf("按照学生姓名查找请按2\n");
	printf("按照学生学号查找请按3\n");
	printf("按照学生性别查找请按4\n");
	printf("请输入查询模式:\n");
	int i;
	scanf("%d",&i);
	system("cls");
	switch(i) {
		case 1:
			whileList(head);
			break;
		case 2:
			chazhao(head);
			break;
		case 3:
			xuehao(head);
			break;
		case 4:
			Xingbie(head);
			break;
	}
}

(1)打印所有学生信息

void whileList(stu *head) {
	printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
	stu *p,*p1;
	p=head;
	p1=p->next ;
	while(p1!=NULL) {
		printf("%13s",p1->name );
		printf("%6d",p1->age );
		printf("%8s",p1->sex );
		printf("%10s",p1->major );
		printf("%17s",p1->id );
		printf("%13d",p1->score );
		printf("\n");
		p1=p1->next ;
	}
	system("pause");
}

 (2)按照姓名查找学生

通过字符串比较来找出要查询的姓名与链表中所相同的姓名,并将其打印出来。特别的,如果存在相同的姓名,则会将同名的人全部打印。

void chazhao(stu *head) {
	stu *p,*p1;
	p=head;
	p1=p->next ;
	char named[20];
	printf("请输入要查找的学生的姓名:\n");
	scanf("%s",&named);
	int n=0;
	while(p1!=NULL) {
		while(strcmp(p1->name ,named)==0) {
			printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
			printf("%13s",p1->name );
			printf("%6d",p1->age );
			printf("%8s",p1->sex );
			printf("%10s",p1->major );
			printf("%17s",p1->id );
			printf("%13d",p1->score );
			printf("\n");
			n=1;
			break;
		}
		p=p1;
		p1=p1->next ;
	}
	if(n==0) {
		printf("该学生不存在!\n请先添加学生信息!\n");
	}
	system("pause");
	return;
}

(3)按照性别查找

同样也是通过字符串比较打印性别为“男”或“女”的学生。

void Xingbie(stu *head) {
	stu *p,*p1;
	p=head;
	p1=p->next ;
	char sexed[20];
	printf("请输入要查找的学生的性别:\n");
	scanf("%s",&sexed);
	printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
	while(p1!=NULL) {
		while(strcmp(p1->sex  ,sexed)==0) {
			printf("%13s",p1->name );
			printf("%6d",p1->age );
			printf("%8s",p1->sex );
			printf("%10s",p1->major );
			printf("%17s",p1->id );
			printf("%13d",p1->score );
			printf("\n");
			break;
		}
		p=p1;
		p1=p1->next ;
		if(p1==NULL) {
			system("pause");
			return;
		}
	}
}

(4)按照学号查找

同样也是通过字符串比较打印出相应学号的学生。

void xuehao(stu *head) {
	stu *p,*p1;
	char id_[20];
	printf("请输入要查找的学生的学号:\n");
	scanf("%s",&id_);
	p=head;
	p1=p->next ;
	while(p1!=NULL) {
		while(strcmp(p1->id  ,id_)==0) {
			printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
			printf("%13s",p1->name );
			printf("%6d",p1->age );
			printf("%8s",p1->sex );
			printf("%10s",p1->major );
			printf("%17s",p1->id );
			printf("%13d",p1->score );
			printf("\n");
			system("pause");
			return;
		}
		p=p1;
		p1=p1->next ;
	}
	if(p1==NULL||strcmp(p1->id  ,id_)!=0) {
		printf("该学生不存在!\n请先添加学生信息!\n");
		system("pause");
	}
}

4.添加新的学生信息

在链表中新增一个学生信息。使用的是头插法。

void insert(stu*head) {
	stu *p,*p1;
	stu *q;
	p1=(stu*)malloc(sizeof(stu));
	p1->next=NULL;
	p = head;
	printf("请输入学生姓名:\n");
	scanf("%s",&p1->name );
	printf("请输入学生年龄:\n");
	scanf("%d",&p1->age );
	while(p1->age <0) {
		printf("请检查是否输入错误,请重新输入!\n");
		scanf("%d",&p1->age );
	}
	printf("请输入学生性别:\n");
	scanf("%s",&p1->sex );
	while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) {
		printf("输入格式有误,请重新输入: (输入男或女!)\n");
		scanf("%s",&p1->sex );
	}
	printf("请输入学生专业:\n");
	scanf("%s",&p1->major );
	printf("请输入学生学号:\n");
	scanf("%s",&p1->id );
	q=head;
	while(q!=NULL) {
		while(strcmp(p1->id ,q->id)==0) {
			printf("该学号已存在,请重新输入!\n");
			scanf("%s",&p1->id);
			q=head;
		}
		q=q->next ;
	}
	printf("请输入学生成绩:\n");
	scanf("%d",&p1->score );
	while(p1->score < 0) {
		printf("请检查是否输入错误,请重新输入!\n");
		scanf("%d",&p1->score );
	}
	while(p->next!=NULL) {
		p=p->next;
	}
	p->next=p1;
	p=p1;
	printf("添加成功!\n");
	system("pause");
}

5.按照学生成绩排序

通过冒泡排序将学生信息按照从高到低的顺序排序并打印出来。

void Paixu(stu *head) {
	stu *p,*p1,*q;
	p=head;
	p1=head->next;
	system("cls");
	while(p->next!=NULL) {                     //冒泡排序
		while(p1->next!=NULL) {
			if(p->next->score<p1->next->score) {
				q=p->next;
				p->next=p1->next;
				p1->next=p1->next->next;
				p->next->next=q;

			} else {
				p1=p1->next;
			}
		}
		p=p->next;
		p1=p->next;
	}
	p=head->next;
	printf("按总成绩从高到低排名如下: \n");
	printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
	while(p) {
		printf("%13s",p->name );
		printf("%6d",p->age );
		printf("%8s",p->sex );
		printf("%10s",p->major );
		printf("%17s",p->id );
		printf("%13d",p->score );
		printf("\n");
		p=p->next ;
	}
	system("pause");
}

6.修改学生信息

可以选择更改学生姓名、学号或者全部信息三种修改模式。

void change(stu *head) {

	printf("请选择需要更改的信息:\n");
	printf("更改全部信息请按1:\n");
	printf("更改姓名请按2:\n");
	printf("更改学号请按3:\n");
	int i;
	scanf("%d",&i);
	system("cls");
	switch(i) {
		case 1:
			All(head);
			break;
		case 2:
			Name(head);
			break;
		case 3:
			Id(head);
			break;
	}
}

(1)打印出修改前此学生的信息

在每次修改学生信息打印出该学生的信息,方便修改。

void XiugaiDayin(stu *N) {
	printf("修改前信息为:\n");
	printf("学生信息:\n\t姓名\t年龄\t性别  \t专业\t\t学号\t\t成绩\n");
	printf("%13s",N->name );
	printf("%6d",N->age );
	printf("%8s",N->sex );
	printf("%10s",N->major );
	printf("%17s",N->id );
	printf("%13d",N->score );
	printf("\n");
}

(2)修改姓名

通过学号找出要修改的学生,并单独修改其姓名。

void Name(stu *head) {
	char ided[20];
	printf("请输入要更改的学生的学号:\n");
	scanf("%s",ided);
	stu *p,*p1;
	p=head;
	p1=p->next ;
	while(p1!=NULL) {
		while(strcmp(p1->id ,ided)==0 ) {
			XiugaiDayin(p1);
			printf("请输入更改后的学生姓名:\n");
			scanf("%s",&p1->name );
			printf("更改成功!\n");
			system("pause");
			return;
		}
		p=p1;
		p1=p1->next ;
	}
	if(p1==NULL||strcmp(p1->id ,ided )!=0) {
		printf("没有该学生!\n");
		system("pause");
	}
}

(3)修改学号

通过学号找出要修改的学生,并单独修改其学号。

void Id(stu *head) {
	char ided[20];
	printf("请输入要更改的学生的学号:\n");
	scanf("%s",ided);
	stu *p,*p1;
	stu *q;
	p=head;
	p1=p->next ;
	while(p1!=NULL) {
		while(strcmp(p1->id ,ided)==0 ) {
			XiugaiDayin(p1);
			printf("请输入更改后的学生学号:\n");
			scanf("%s",&p1->id );
			printf("更改成功!\n");
			system("pause");
			return;
		}
		p=p1;
		p1=p1->next ;
	}
	if(p1==NULL||strcmp(p1->id ,ided )!=0) {
		printf("没有该学生!\n");
		system("pause");
	}
}

(4)修改全部信息

通过学号找出要修改的学生,并修改其全部信息。

void All(stu *head) {
	char ided[20];
	printf("请输入要更改的学生的学号:\n");
	scanf("%s",ided);
	stu *p,*p1;
	stu *q;
	p=head;
	p1=p->next ;
	while(p1!=NULL) {
		while(strcmp(p1->id ,ided)==0 ) {
			XiugaiDayin(p1);
			printf("请输入更改后的学生姓名:\n");
			scanf("%s",&p1->name );
			printf("请输入更改后的学生年龄:\n");
			scanf("%d",&p1->age );
			while(p1->age <0) {
				printf("请检查是否输入错误,请重新输入!\n");
				scanf("%d",&p1->age );
			}
			printf("请输入更改后的学生性别:\n");
			scanf("%s",&p1->sex );
			while(strcmp(p1->sex,"男")!=0&&strcmp(p1->sex,"女")!=0 ) {
				printf("输入格式有误,请重新输入: (输入男或女!)\n");
				scanf("%s",&p1->sex );
			}
			printf("请输入更改后的学生专业:\n");
			scanf("%s",&p1->major );
			printf("请输入更改后的学生学号:\n");
			scanf("%s",&p1->id );
			printf("请输入更改后的学生成绩:\n");
			scanf("%d",&p1->score );
			while(p1->score < 0) {
				printf("请检查是否输入错误,请重新输入!\n");
				scanf("%d",&p1->score );
			}
			printf("更改成功!\n");
			system("pause");
			return;
		}
		p=p1;
		p1=p1->next ;
	}
	if(p1==NULL||strcmp(p1->id ,ided )!=0) {
		printf("没有该学生!\n");
		system("pause");
	}
}

7.删除学生信息

通过学号找出要删除的学生信息,将其从链表中剔除,并将其所占用的空间释放掉。

void Delete(stu *head) {
	stu *p,*p1;
	char n[20];
	printf("请输入要删除的学生的学号:\n");
	scanf("%s",&n);
	p= head;
	p1=p->next ;
	while(p1!=NULL) {
		while(strcmp(p1->id ,n)==0) {
			p->next =p1->next ;
			free(p1);
			printf("删除成功!\n");
			system("pause");
			return;
		}
		p=p1;
		p1=p->next ;
	}
	if(p1==NULL||strcmp(n,p1->id  )!=0) {
		printf("没有该学生!\n");
		system("pause");
	}

}

8.保存学生信息

将当前链表中的学生信息保存到电脑D盘中。

void save(stu *head) {
	FILE *fp;
	fp=fopen("D:\\学生信息.txt","w");
	stu *p=head;
	p=p->next ;
	fprintf(fp,"学生信息:\n\t姓名\t年龄\t性别\t专业   \t学号    \t成绩\n");
	while(p!=NULL) {

		fprintf(fp,"\t%3s %6d %6s %10s %15s %12d\n",p->name ,p->age ,p->sex ,p->major ,p->id ,p->score );
		p=p->next ;
	}
	fclose(fp);
	printf("保存成功!");
	system("pause");
}

9.主函数

主函数包括控制小黑框的大小,更改背景与字体颜色,头指针与头节点的创建,打印出相应菜单,通过switch语句选择要实现的功能。

int main() {
	system("mode concols=100 lines=30");
	system("color 3E");
	stu *head=(stu*)malloc(sizeof(stu));
	head->next =NULL;
	char a;
	while(1) {
		system("cls");
		printf("\t\t\t\t\t**************************\n");
		printf("\t\t\t\t\t*  欢迎使用学生管理系统  *\n");
		printf("\t\t\t\t\t*  请选择想要使用的功能  *\n");
		printf("\t\t\t\t\t*    添加学生信息请按1   *\n");
		printf("\t\t\t\t\t*    查看学生信息请按2   *\n");
		printf("\t\t\t\t\t*    新增学生信息请按3   *\n");
		printf("\t\t\t\t\t*    按照成绩排序请按4   *\n");
		printf("\t\t\t\t\t*    更改学生信息请按5   *\n");
		printf("\t\t\t\t\t*    删除学生信息请按6   *\n");
		printf("\t\t\t\t\t*    保存学生信息请按7   *\n");
		printf("\t\t\t\t\t*      退出系统请按8     *\n");
		printf("\t\t\t\t\t**************************\n");
		scanf("%s",&a);
		switch(a) {
			case '1':
				system("cls");
				add(head);
				break;
			case '2':
				system("cls");
				find(head);
				break;
			case '3':
				system("cls");
				insert(head);
				break;
			case '4':
				system("cls");
				Paixu(head);
				break;
			case '5':
				system("cls");
				change(head);
				break;
			case '6':
				system("cls");
				Delete(head);
				break;
			case '7':
				system("cls");
				save(head);
				break;
			case '8':
				exit(0);
				break;
			default :
				system("cls");
				printf("输入方式错误,请重新输入!\n");
				system("pause");
				break;
		}
	}
	return 0;
}

10.演示

 1.添加学生信息

2.查看学生信息

 

 

3.按照成绩排序

 

4.更改学生信息

 

5.删除学生

 

篇幅有限不过多演示! 

  • 19
    点赞
  • 130
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值