Bootstrap

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

单链表实现学生信息系统的创建

一:需要实现的操作:

1.输出学生信息;
2.学号查找学生;
3.姓名查找学生;
5.学科最高成绩;
6.删除一位学生;
7.修改学生信息;
8.添加学生信息;
9.学生平均成绩;

二:代码详解:

1.首先列出了能会用到的头文件:

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

2.写一个menu函数列出该系统的所有功能:

void menu()								//主界面 
{
	printf("**************************************\n");
	printf("************1.输出学生信息************\n");
	printf("\n"); 
	printf("************2.学号查找学生************\n");
	printf("\n");
	printf("************3.姓名查找学生************\n");
	printf("\n");
	printf("************5.学科最高成绩************\n");
	printf("\n");
	printf("************6.删除一位学生************\n");
	printf("\n");
	printf("************7.修改学生信息************\n");
	printf("\n");
	printf("************8.添加学生信息************\n");
	printf("\n");
	printf("************9.学生平均成绩************\n");
	printf("**************************************\n");
	printf("\n");
}

3.结构体:

typedef struct student
{
	int id;
	char name[20];
	float  score;
	struct student*next;
}stu;

结构体中定义了学号,姓名,成绩三种成员,可以根据需要进行增添;

4.建立动态链表并初步录入学生信息:

stu *creat()							//建立一个动态链表并输入学生信息 
{
	stu *head;
	stu *p,*tail;
 	p=(struct student*)malloc(sizeof(struct student));
 	head=p;
 	tail=p;
 	head->next=NULL;
 	int n=3;
 	printf("*请输入需要的学生个数\n");
 	scanf("%d",&n);
 	for(int i=0;i<n;i++){
	 	p=(struct student*)malloc(sizeof(struct student));
	 	printf("请输入学生学号 ");
	 	scanf("%d",&p->id);
	 	printf("请输入学生姓名 ");
	 	scanf("%s",p->name);
	 	printf("请输入学生成绩 ");
		scanf("%f",&p->score);
		printf("\n");
		tail->next=p;
		tail=p;
		tail->next=NULL;
	 }
	return(head);
}

建立一个单链表,定义头指针,尾指针,利用for循环录入n个学生的信息,注意for循环中的tail与p两个指针的转换的顺序不能错。

5.写输出函数

void print(stu *head)								//打印出学生信息 
{
	stu *p;
	p=head->next;
	if(head!=NULL){
		while(p!=NULL){
			printf("%d %s %f\n",p->id,p->name,p->score);
			p=p->next;
		}
	}
	printf("\n");
}

利用while循环依次输出学生信息,注意score为浮点型数据,所以注意printf中的%f.

6.通过学号查找学生信息:

void id_search(stu *head){		//通过学号查找学生信息 
	stu *p;
	int id,n;
	printf("*请输入要查找的id\n");
	scanf("%d",&id);
	p=head->next;
	while(p!=NULL){
		if(id==p->id){
			n=1;
			break;
		}
		else{ 
		n=0;
		p=p->next;
		}
	}
	if(n==1){
	printf("%d %s %f\n",p->id,p->name,p->score);
	printf("\n");
	}
	else if(n==0)
	printf("*没有该学生*\n");
}

7.通过姓名查找学生信息:

void name_search(stu *head)	//通过姓名查找学生信息 
{
	stu *p;
	int n;
	char ch[20];
	printf("*请输入需要查找的学生姓名\n");
	scanf("%s",ch);
	p=head->next;
	while(p!=NULL){
		if(strcmp(p->name,ch)==0)
		{
			n=1;
			break;
		}
		else{
		n=0;
		p=p->next;}
	}
	if(n==1)
	{
		printf("%d %s %f\n",p->id,p->name,p->score);
		printf("\n");
	}
	else if(n==0)
    	printf("*没有找到该学生*\n");
}

注意字符串函数strcmp的用法;

8.函数实现对学生信息的修改:

void emend(stu *head)	//函数实现学生信息的修改 
{
	stu *p;
	p=head->next;
	int a,b=0;
	printf("请输入需要修改的学生学号\n");
	scanf("%d",&a);
	while(p!=NULL)
	{
		if(p->id==a)
		{
		printf("请输入新的学生学号 ");
		scanf("%d",&p->id);
		printf("请输入新的学生姓名 ");
	 	scanf("%s",p->name);
	 	printf("请输入新的学生成绩 ");
		scanf("%f",&p->score);
		printf("\n");
		b=1;
		break;
		}
		p=p->next;
	} 
	if(b==0)
	printf("没有找到该学生\n");
}

修改学生信息时不需要考虑原来的数据,因为给变量赋值一个新数据后,会覆盖原来的数据。

9.删除学生信息:

void deletee(stu *head)	//删除一位学生的信息 
{
	int n,a=0;
	stu *p,*q;
	if(head!=NULL){
	p=head;
	printf("请输入需要删除的学生学号\n");
	scanf("%d",&n);
	while(p!=NULL){
		q=p;
		p=p->next;
		if(n==p->id){
			q->next=p->next;
			free(p);
			a=1;
			break; 
		}else{
		a=0;
		continue;
		}
	}
	if(a==1)
	printf("成功删除学生\n");
	}
	else
	printf("没有找到该学生\n"); 
} 

 学生信息的删除操作和单链表中的删除操作一样,不再过多阐述。

10.头插一位学生信息:

void headadd(stu *head)									//头插一位学生信息 
{
	stu *p,*q;
	p=head->next;
	q=(stu *)malloc(sizeof(stu));
	printf("请输入学生学号 ");
		scanf("%d",&q->id);
	printf("请输入学生姓名 ");
		scanf("%s",q->name);
	printf("请输入学生成绩 ");
		scanf("%f",&q->score);
	printf("\n");
	head->next=q;
	q->next=p;
} 

11.尾插一位学生信息:

void tailadd(stu *head)									//尾插一位学生信息 
{
	stu *p,*q,*tail;
	p=head->next;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	tail=p;
	tail->next=NULL;
	q=(stu *)malloc(sizeof(stu));
	printf("请输入学生学号 ");
		scanf("%d",&q->id);
	printf("请输入学生姓名 ");
		scanf("%s",q->name);
	printf("请输入学生成绩 ");
		scanf("%f",&q->score);
	printf("\n");
	tail->next=q;
	tail=q;
	tail->next=NULL;
}

12.函数返回最高成绩:

float score_max(stu *head)										//学生最高成绩
{
	stu *p;
	p=head->next;
	float max=0;
	while(p!=NULL){
		if(p->score>max){
			max=p->score;
		}
		p=p->next;
	}
    return max;
} 

注意score的类型,和max与p->data的转换。

13.输出最高成绩的学生信息:

void print_max(stu *head,float max)									//输出该学生信息 
{
	int n=0;
	stu *p;
	p=head->next;
	while(p!=NULL){
		if(max==p->score){
	    n=1;
			break;
		}
		else
		n=0;
		p=p->next;
	}
	if(n==1)
	{
		printf("%d %s %f\n",p->id,p->name,p->score);
	}
	else if(n==0)
	printf("*没有找到该学生*\n");
}

其实这一步就是按成绩查找学生信息,只不过函数多了一个形参用于传入最高成绩。

14.求学生的平均成绩:

void averege(stu *head)								//求学生平均成绩 
{
	stu *p;
	p=head->next;
	float sum=0,ave;
	int n=0;
	while(p!=NULL)
	{
		
		sum=sum+p->score;
		n=n+1;p=p->next;
	}
	ave=sum/n;
	printf("%f\n",ave);
}

15.全部函数展示:


void menu();
stu *creat();
void print(stu *head);
void id_search(stu *head);
void name_search(stu *head);
void emend(stu *head);
void deletee(stu *head);
float score_max(stu *head);
void print_max(stu *head,float max);
void save(stu *head);
void averege(stu *head);

16.main函数:

int main()													//建立主函数 
{
	system("color 75");										//控制字体和背景颜色 
	stu *head;
	printf("*暂无学生信息,请先输入学生信息*\n");
	printf("\n");
	head=creat();
	while(1){
	menu2();
	int chosee;
	printf("*请输入需要进行的操作\n");
	scanf("%d",&chosee);
		switch(chosee){
			case 1:
				print(head);break;
			case 2:
				id_search(head);break;
			case 3:
				name_search(head);break;
			case 4:
				save(head);break;
			case 5:
				float max;
				max=score_max(head);
				printf("*最高成绩为 %f\n",max);
				printf("*是否要查看该学生信息* \n");
				int a;
				printf("\t*是(1)*\n\t*否(0)*\n");
					scanf("%d",&a);
				if(a==1){
					print_max(head,max);
				}
				break;
			case 6:deletee(head);
				printf("*是否要查看删除后学生信息* \n");
							int b;
				printf("\t*是(1)*\n\t*否(0)*\n");
					scanf("%d",&b);
				if(b==1){
					print(head);
						}
				break;
			case 7:emend(head);break;
			case 8:printf("请选择要添加新学生的位置\n");
				printf("\t1.添加为第一个\n\t2.添加为最后一个\n");
				int t;
				scanf("%d",&t);
				if(t==1)
				headadd(head);
				else
				tailadd(head);
				break;
			case 9:averege(head);break; 
			case 0:
				printf("*欢迎下次使用*\n");
			exit(0);
				default :printf("*输入错误,请重新输入*\n"); 
				break;
		}
	}
	return 0;
}                     

三:完整代码展示:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct student
{
	int id;
	char name[20];
	float  score;
	struct student*next;
}stu;
void menu()								//主界面 
{
	printf("**************************************\n");
	printf("************1.输出学生信息************\n");
	printf("\n"); 
	printf("************2.学号查找学生************\n");
	printf("\n");
	printf("************3.姓名查找学生************\n");
	printf("\n");
	printf("************5.学科最高成绩************\n");
	printf("\n");
	printf("************6.删除一位学生************\n");
	printf("\n");
	printf("************7.修改学生信息************\n");
	printf("\n");
	printf("************8.添加学生信息************\n");
	printf("\n");
	printf("************9.学生平均成绩************\n");
	printf("**************************************\n");
	printf("\n");
}

stu *creat()							//建立一个动态链表并输入学生信息 
{
	stu *head;
	stu *p,*tail;
 	p=(struct student*)malloc(sizeof(struct student));
 	head=p;
 	tail=p;
 	head->next=NULL;
 	int n=3;
 	printf("*请输入需要的学生个数\n");
 	scanf("%d",&n);
 	for(int i=0;i<n;i++){
	 	p=(struct student*)malloc(sizeof(struct student));
	 	printf("请输入学生学号 ");
	 	scanf("%d",&p->id);
	 	printf("请输入学生姓名 ");
	 	scanf("%s",p->name);
	 	printf("请输入学生成绩 ");
		scanf("%f",&p->score);
		printf("\n");
		tail->next=p;
		tail=p;
		tail->next=NULL;
	 }
	return(head);
}
void print(stu *head)								//打印出学生信息 
{
	stu *p;
	p=head->next;
	if(head!=NULL){
		while(p!=NULL){
			printf("%d %s %f\n",p->id,p->name,p->score);
			p=p->next;
		}
	}
	printf("\n");
}
void id_search(stu *head){									//通过学号查找学生信息 
	stu *p;
	int id,n;
	printf("*请输入要查找的id\n");
	scanf("%d",&id);
	p=head->next;
	while(p!=NULL){
		if(id==p->id){
			n=1;
			break;
		}
		else{ 
		n=0;
		p=p->next;
		}
	}
	if(n==1){
	printf("%d %s %f\n",p->id,p->name,p->score);
	printf("\n");
	}
	else if(n==0)
	printf("*没有该学生*\n");
}
void name_search(stu *head)											//通过姓名查找学生信息 
{
	stu *p;
	int n;
	char ch[20];
	printf("*请输入需要查找的学生姓名\n");
	scanf("%s",ch);
	p=head->next;
	while(p!=NULL){
		if(strcmp(p->name,ch)==0)
		{
			n=1;
			break;
		}
		else{
		n=0;
		p=p->next;}
	}
	if(n==1)
	{
		printf("%d %s %f\n",p->id,p->name,p->score);
		printf("\n");
	}
	else if(n==0)
    	printf("*没有找到该学生*\n");
}
void emend(stu *head)										//函数实现学生信息的修改 
{
	stu *p;
	p=head->next;
	int a,b=0;
	printf("请输入需要修改的学生学号\n");
	scanf("%d",&a);
	while(p!=NULL)
	{
		if(p->id==a)
		{
		printf("请输入新的学生学号 ");
		scanf("%d",&p->id);
		printf("请输入新的学生姓名 ");
	 	scanf("%s",p->name);
	 	printf("请输入新的学生成绩 ");
		scanf("%f",&p->score);
		printf("\n");
		b=1;
		break;
		}
		p=p->next;
	} 
	if(b==0)
	printf("没有找到该学生\n");
}
void deletee(stu *head)										//删除一位学生的信息 
{
	int n,a=0;
	stu *p,*q;
	if(head!=NULL){
	p=head;
	printf("请输入需要删除的学生学号\n");
	scanf("%d",&n);
	while(p!=NULL){
		q=p;
		p=p->next;
		if(n==p->id){
			q->next=p->next;
			free(p);
			a=1;
			break; 
		}else{
		a=0;
		continue;
		}
	}
	if(a==1)
	printf("成功删除学生\n");
	}
	else
	printf("没有找到该学生\n"); 
} 
void headadd(stu *head)									//头插一位学生信息 
{
	stu *p,*q;
	p=head->next;
	q=(stu *)malloc(sizeof(stu));
	printf("请输入学生学号 ");
		scanf("%d",&q->id);
	printf("请输入学生姓名 ");
		scanf("%s",q->name);
	printf("请输入学生成绩 ");
		scanf("%f",&q->score);
	printf("\n");
	head->next=q;
	q->next=p;
} 
void tailadd(stu *head)									//尾插一位学生信息 
{
	stu *p,*q,*tail;
	p=head->next;
	while(p->next!=NULL)
	{
		p=p->next;
	}
	tail=p;
	tail->next=NULL;
	q=(stu *)malloc(sizeof(stu));
	printf("请输入学生学号 ");
		scanf("%d",&q->id);
	printf("请输入学生姓名 ");
		scanf("%s",q->name);
	printf("请输入学生成绩 ");
		scanf("%f",&q->score);
	printf("\n");
	tail->next=q;
	tail=q;
	tail->next=NULL;
}
float score_max(stu *head)										//学生最高成绩
{
	stu *p;
	p=head->next;
	float max=0;
	while(p!=NULL){
		if(p->score>max){
			max=p->score;
		}
		p=p->next;
	}
    return max;
} 
void print_max(stu *head,float max)									//输出该学生信息 
{
	int n=0;
	stu *p;
	p=head->next;
	while(p!=NULL){
		if(max==p->score){
	    n=1;
			break;
		}
		else
		n=0;
		p=p->next;
	}
	if(n==1)
	{
		printf("%d %s %f\n",p->id,p->name,p->score);
	}
	else if(n==0)
	printf("*没有找到该学生*\n");
}
void averege(stu *head)								//求学生平均成绩 
{
	stu *p;
	p=head->next;
	float sum=0,ave;
	int n=0;
	while(p!=NULL)
	{
		
		sum=sum+p->score;
		n=n+1;p=p->next;
	}
	ave=sum/n;
	printf("%f\n",ave);
}
void menu();
stu *creat();
void print(stu *head);
void id_search(stu *head);
void name_search(stu *head);
void emend(stu *head);
void deletee(stu *head);
float score_max(stu *head);
void print_max(stu *head,float max);
void save(stu *head);
void averege(stu *head);
 

int main()													//建立主函数 
{
	system("color 75");										//控制字体和背景颜色 
	stu *head;
	printf("*暂无学生信息,请先输入学生信息*\n");
	printf("\n");
	head=creat();
	while(1){
	menu2();
	int chosee;
	printf("*请输入需要进行的操作\n");
	scanf("%d",&chosee);
		switch(chosee){
			case 1:
				print(head);break;
			case 2:
				id_search(head);break;
			case 3:
				name_search(head);break;
			case 4:
				save(head);break;
			case 5:
				float max;
				max=score_max(head);
				printf("*最高成绩为 %f\n",max);
				printf("*是否要查看该学生信息* \n");
				int a;
				printf("\t*是(1)*\n\t*否(0)*\n");
					scanf("%d",&a);
				if(a==1){
					print_max(head,max);
				}
				break;
			case 6:deletee(head);
				printf("*是否要查看删除后学生信息* \n");
							int b;
				printf("\t*是(1)*\n\t*否(0)*\n");
					scanf("%d",&b);
				if(b==1){
					print(head);
						}
				break;
			case 7:emend(head);break;
			case 8:printf("请选择要添加新学生的位置\n");
				printf("\t1.添加为第一个\n\t2.添加为最后一个\n");
				int t;
				scanf("%d",&t);
				if(t==1)
				headadd(head);
				else
				tailadd(head);
				break;
			case 9:averege(head);break; 
			case 0:
				printf("*欢迎下次使用*\n");
			exit(0);
				default :printf("*输入错误,请重新输入*\n"); 
				break;
		}
	}
	return 0;
}                                

*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!

;