学习完C语言基础知识点,现在来用单链表、函数、指针的相关知识写一个简单版学生成绩管理系统,主要实现增删改查的基本功能。

主界面:(自己设计)

void main(){system("cls");printf("\n\n");printf("\t\t\t===========================================\n");printf("\t\t\t| |\n");printf("\t\t\t|欢迎来到学生成绩管理系统 |\n");printf("\t\t\t| |\n");printf("\t\t\t|=========================================|\n");printf("\t\t\t|请选择要操作的命令 |\n");printf("\t\t\t|-----------------------------------------|\n");printf("\t\t\t| |\n");printf("\t\t\t|1.录入学生信息|\n");printf("\t\t\t|2.显示学生信息|\n");printf("\t\t\t|3.增加学生信息|\n");printf("\t\t\t|4.删除学生信息|\n");printf("\t\t\t|5.修改学生信息|\n");printf("\t\t\t|6.查找学生信息|\n");printf("\t\t\t|7.按总分排序|\n");printf("\t\t\t| |\n");printf("\t\t\t===========================================\n");int Item;//保存操作命令pnode phead=NULL;//定义一个指针while(1){printf("请选择操作命令:");scanf("%d",&Item);system("cls");//清屏switch(Item){case 1://录入学生信息{phead=Input();}break;case 2://显示学生信息{Show(phead);}break;case 3://增加学生信息{Add(phead);}break;case 4://删除学生信息{Delete(phead);}break;case 5://修改学生信息{Change(phead);}break;case 6://查找学生信息{Search(phead);}break;case 7://总分排序{Sort(phead);Show(phead);}break;default:break;}}system("pause");}

1.定义一个学生结构和一个结点结构,用于存储信息。

学生结构:

//学生结构 struct Student{char Name[10];int Num;float Computer;float Math;float English;float Total;float Ave;};

结点结构:

//结点 typedef struct Node{struct Student st;//数据域struct node *pnext;//指针域}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext 

2.定义一些函数来处理学生信息。

函数模块:

//函数pnode Input();//录入学生信息void Show(pnode phead);//显示学生信息void Add(pnode phead);//增加学生信息void Delete(pnode phead);//删除学生信息void Change(pnode phead);//修改学生信息void Search(pnode phead);//查找学生信息void Sort(pnode phead);//总分排序 

1)录入学生信息pnode Input()

//录入学生信息pnode Input(){int num;//学生的人数node stu;//学生结构pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存//判断内存是否为空if(NULL==phead){printf("内存分配失败,程序终止!\n");exit(-1);}pnode ptail=phead;//定义一个指向头结点的指针ptail->pnext=NULL;//清空指针域printf("请输入学生的人数:");scanf("%d",&num);int i;for(i=0;i<num;i++){printf("请输入第%d个学生的姓名:",i+1);scanf("%s",stu.st.Name);printf("请输入第%d个学生的学号:",i+1);scanf("%d",&stu.st.Num);printf("请输入第%d个学生的计算机成绩:",i+1);scanf("%f",&stu.st.Computer);printf("请输入第%d个学生的高数成绩:",i+1);scanf("%f",&stu.st.Math);printf("请输入第%d个学生的大英成绩:",i+1);scanf("%f",&stu.st.English); //计算总分stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;//计算平均分stu.st.Ave=stu.st.Total/3.0f;//为新节点分配内存pnode pnew=(pnode)malloc(sizeof(node));//判断内存是否为空if(NULL==pnew){printf("内存分配失败,程序终止!\n");exit(-1);}pnew->st=stu.st;//初始化结点的数据域ptail->pnext=pnew;//将新结点挂到老结点后pnew->pnext=NULL;//清空新结点的指针域ptail=pnew;//将ptail移到新结点上}return phead;}

2)显示学生信息void Show(pnode phead)

//显示学生信息void Show(pnode phead){//定义一个指针用于遍历学生信息pnode p=phead->pnext;printf("姓名学号 计算机 高数大英 总分 平均分\n");while(NULL!=p){printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);p=p->pnext;}}

3)增加学生信息void Add(pnode phead)

//增加学生信息void Add(pnode phead){pnode p=phead;int i=0;struct Student stu;//学生结构体 int loc;//插入结点的位置printf("请输入插入学生的位置:");scanf("%d",&loc);while(NULL!=p&&i<loc-1){p=p->pnext;i++;}if(NULL==p||i>loc){printf("插入结点的位置不存在!\n");return;}printf("你将在第%d个学生后面插入一个学生\n",loc-1);printf("请输入第%d个学生的姓名:",loc);scanf("%s",stu.Name);printf("请输入第%d个学生的学号:",loc);scanf("%d",&stu.Num);printf("请输入第%d个学生的计算机成绩:",loc);scanf("%f",&stu.Computer);printf("请输入第%d个学生的高数成绩:",loc);scanf("%f",&stu.Math);printf("请输入第%d个学生的大英成绩:",loc);scanf("%f",&stu.English);stu.Total=stu.Computer+stu.Math+stu.English;//计算总分stu.Ave=stu.Total/3.0f;//计算平均分pnode pnew=(pnode)malloc(sizeof(node));if(NULL==pnew){printf("动态内存分配失败,程序终止!\n");exit(-1);}pnew->st=stu;pnode q=p->pnext;p->pnext=pnew;pnew->pnext=q;}


4)删除学生信息void Delete(pnode phead)

//删除学生信息void Delete(pnode pHead){pnode p = pHead;int i = 0;int loc;printf("请输入你需要删除的学生的编号:");scanf("%d",&loc);while(NULL!=p->pnext&&i<loc-1){p=p->pnext;i++;}if(NULL==p->pnext||i>loc-1){printf("没找到需要删除的学生的编号!\n");return;}pnode q=p->pnext;p->pnext=q->pnext;free(q);q==NULL;printf("你已经成功删除了第%d个学生的信息!\n",loc);}

5)修改学生信息void Change(pnode phead)

//修改学生信息void Change(pnode phead){char Name[10];printf("请输入你需要修改的学生的姓名:");scanf("%s",&Name);pnode p=phead->pnext;//定义一个指针用于遍历学生信息while(NULL!=p){if(0==strcmp(Name,p->st.Name)){printf("姓名学号 计算机 高数大英 总分 平均分\n");printf("修改前的学生信息!\n");printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);system("pause");system("cls");//清屏printf("请输入新的学生姓名:");scanf("%s",p->st.Name);printf("请输入新的学生学号:");scanf("%d",&p->st.Num);printf("请输入新的学生的计算机成绩:");scanf("%f",&p->st.Computer);printf("请输入新的学生的高数成绩:");scanf("%f",&p->st.Math);printf("请输入新的学生的大英成绩:");scanf("%f",&p->st.English);p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分p->st.Ave=p->st.Total/3.0f;//计算平均分 break;}p=p->pnext;}}



6)查找学生信息void Search(pnode phead)

//查找学生信息void Search(pnode pHead){char Name[10];printf("请输入你需要查找的学生的姓名:");scanf("%s",Name);pnode p=pHead->pnext;printf("姓名学号 计算机 高数大英 总分 平均分\n"); while(NULL!=p){if(0==strcmp(Name,p->st.Name)){printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);} p=p->pnext;}}

7)按总分排序void Sort(pnode phead)

//总分排序void Sort(pnode phead){pnode p, q;//定义两个指针node temp;for(p=phead->pnext;NULL!=p;p=p->pnext){for(q=p->pnext;NULL!=q;q=q->pnext){if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时 {temp.st=p->st;//交换学生的位置p->st=q->st;q->st=temp.st;}}}}

完整代码:

#include#include#include//学生结构体 struct Student{char Name[10];int Num;float Computer;float Math;float English;float Total;float Ave;};//结点 typedef struct Node{struct Student st;//数据域struct node *pnext;//指针域}node, *pnode;//*node等价于struct Student st,pnode等价于struct Node *pNext //函数pnode Input();//录入学生信息void Show(pnode phead);//显示学生信息void Add(pnode phead);//增加学生信息void Delete(pnode phead);//删除学生信息void Change(pnode phead);//修改学生信息void Search(pnode phead);//查找学生信息void Sort(pnode phead);//总分排序  void main(){system("cls");printf("\n\n");printf("\t\t\t============================================\n");printf("\t\t\t||\n");printf("\t\t\t|欢迎来到学生成绩管理系统|\n");printf("\t\t\t||\n");printf("\t\t\t|==========================================|\n");printf("\t\t\t|请选择要操作的命令|\n");printf("\t\t\t|------------------------------------------|\n");printf("\t\t\t||\n");printf("\t\t\t|1.录入学生信息|\n");printf("\t\t\t|2.显示学生信息|\n");printf("\t\t\t|3.增加学生信息|\n");printf("\t\t\t|4.删除学生信息|\n");printf("\t\t\t|5.修改学生信息|\n");printf("\t\t\t|6.查找学生信息|\n");printf("\t\t\t|7.按总分排序|\n");printf("\t\t\t||\n");printf("\t\t\t============================================\n");int Item;//保存操作命令pnode phead=NULL;//定义一个指针while(1){printf("请选择操作命令:");scanf("%d",&Item);system("cls");//清屏switch(Item){case 1://录入学生信息{phead=Input();}break;case 2://显示学生信息{Show(phead);}break;case 3://增加学生信息{Add(phead);}break;case 4://删除学生信息{Delete(phead);}break;case 5://修改学生信息{Change(phead);}break;case 6://查找学生信息{Search(phead);}break;case 7://总分排序{Sort(phead);Show(phead);}break;default:break;}}system("pause");}//录入学生信息pnode Input(){int num;//学生的人数node stu;//学生结构pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存//判断内存是否为空if(NULL==phead){printf("内存分配失败,程序终止!\n");exit(-1);}pnode ptail=phead;//定义一个指向头结点的指针ptail->pnext=NULL;//清空指针域printf("请输入学生的人数:");scanf("%d",&num);int i;for(i=0;i<num;i++){printf("请输入第%d个学生的姓名:",i+1);scanf("%s",stu.st.Name);printf("请输入第%d个学生的学号:",i+1);scanf("%d",&stu.st.Num);printf("请输入第%d个学生的计算机成绩:",i+1);scanf("%f",&stu.st.Computer);printf("请输入第%d个学生的高数成绩:",i+1);scanf("%f",&stu.st.Math);printf("请输入第%d个学生的大英成绩:",i+1);scanf("%f",&stu.st.English);stu.st.Total=stu.st.Computer+stu.st.Math+stu.st.English;//计算总分stu.st.Ave=stu.st.Total/3.0f;//计算平均分pnode pnew=(pnode)malloc(sizeof(node));//为新节点分配内存//判断内存是否为空if(NULL==pnew){printf("内存分配失败,程序终止!\n");exit(-1);}pnew->st=stu.st;//初始化结点的数据域ptail->pnext=pnew;//将新结点挂到老结点后pnew->pnext=NULL;//清空新结点的指针域ptail=pnew;//将ptail移到新结点上}return phead;}//显示学生信息void Show(pnode phead){//定义一个指针用于遍历学生信息pnode p=phead->pnext;printf("姓名学号 计算机 高数大英 总分 平均分\n");while(NULL!=p){printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);p=p->pnext;}}//增加学生信息void Add(pnode phead){pnode p=phead;int i=0;struct Student stu;//学生结构体 int loc;//插入结点的位置printf("请输入插入学生的位置:");scanf("%d",&loc);while(NULL!=p&&i<loc-1){p=p->pnext;i++;}if(NULL==p||i>loc){printf("插入结点的位置不存在!\n");return;}printf("你将在第%d个学生后面插入一个学生\n",loc-1);printf("请输入第%d个学生的姓名:",loc);scanf("%s",stu.Name);printf("请输入第%d个学生的学号:",loc);scanf("%d",&stu.Num);printf("请输入第%d个学生的计算机成绩:",loc);scanf("%f",&stu.Computer);printf("请输入第%d个学生的高数成绩:",loc);scanf("%f",&stu.Math);printf("请输入第%d个学生的大英成绩:",loc);scanf("%f",&stu.English);stu.Total=stu.Computer+stu.Math+stu.English;//计算总分stu.Ave=stu.Total/3.0f;//计算平均分pnode pnew=(pnode)malloc(sizeof(node));if(NULL==pnew){printf("动态内存分配失败,程序终止!\n");exit(-1);}pnew->st=stu;pnode q=p->pnext;p->pnext=pnew;pnew->pnext=q;}//删除学生信息void Delete(pnode pHead){pnode p = pHead;int i = 0;int loc;printf("请输入你需要删除的学生的编号:");scanf("%d",&loc);while(NULL!=p->pnext&&i<loc-1){p=p->pnext;i++;}if(NULL==p->pnext||i>loc-1){printf("没找到需要删除的学生的编号!\n");return;}pnode q=p->pnext;p->pnext=q->pnext;free(q);q==NULL;printf("你已经成功删除了第%d个学生的信息!\n",loc);}//修改学生信息void Change(pnode phead){char Name[10];printf("请输入你需要修改的学生的姓名:");scanf("%s",&Name);pnode p=phead->pnext;//定义一个指针用于遍历学生信息while(NULL!=p){if(0==strcmp(Name,p->st.Name)){printf("姓名学号 计算机 高数大英 总分 平均分\n");printf("修改前的学生信息!\n");printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);system("pause");system("cls");//清屏printf("请输入新的学生姓名:");scanf("%s",p->st.Name);printf("请输入新的学生学号:");scanf("%d",&p->st.Num);printf("请输入新的学生的计算机成绩:");scanf("%f",&p->st.Computer);printf("请输入新的学生的高数成绩:");scanf("%f",&p->st.Math);printf("请输入新的学生的大英成绩:");scanf("%f",&p->st.English);p->st.Total=p->st.Computer+p->st.Math+p->st.English;//计算总分p->st.Ave=p->st.Total/3.0f;//计算平均分 break;}p=p->pnext;}}//查找学生信息void Search(pnode pHead){char Name[10];printf("请输入你需要查找的学生的姓名:");scanf("%s",Name);pnode p=pHead->pnext;printf("姓名学号 计算机 高数大英 总分 平均分\n"); while(NULL!=p){if(0==strcmp(Name,p->st.Name)){printf("%s%d%g%g%g %g%g\n",p->st.Name,p->st.Num,p->st.Computer,p->st.Math,p->st.English,p->st.Total,p->st.Ave);} p=p->pnext;}}//总分排序void Sort(pnode phead){pnode p, q;//定义两个指针node temp;for(p=phead->pnext;NULL!=p;p=p->pnext){for(q=p->pnext;NULL!=q;q=q->pnext){if(p->st.Total<q->st.Total)//当前一个学生的总分小于后一个学生的总分时 {temp.st=p->st;//交换学生的位置p->st=q->st;q->st=temp.st;}}}}
仅用于本人学习记录,路过的小伙伴有任何问题欢迎评论!