单链表实现学生信息系统的创建
一:需要实现的操作:
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;
}
*注:本文完全是自己敲出来的,如果有些许错误还请谅解!!!