本程序是一个学生成绩管理系统,使用链表来存储学生信息,包含录入学生信息、显示学生信息、增加学生信息、删除学生信息、修改学生信息、查找学生信息、按总分排序等功能。程序的设计思路如下:

  1. 首先定义了一个学生结构体类型,包含姓名、学号、计算机成绩、高数成绩、英语成绩、总分和平均分等成员变量。

  2. 定义了一个结点类型,包含数据域和指针域。

  3. 在主函数中,使用循环和switch语句实现了程序的操作界面,根据用户的选择调用相应的函数。

  4. 录入学生信息函数Input(),使用动态内存分配来创建链表,输入每个学生的信息,计算总分和平均分,并将学生信息添加到链表中。

  5. 显示学生信息函数Show(),遍历链表,输出每个学生的信息。

  6. 增加学生信息函数Add(),输入要插入的学生信息和位置,将新的学生信息插入到指定位置。

  7. 删除学生信息函数Delete(),输入要删除的学生编号,遍历链表找到要删除的学生信息,删除该学生的结点。

  8. 修改学生信息函数Change(),输入要修改的学生姓名,遍历链表找到要修改的学生信息,输出该学生的信息,输入新的学生信息,修改学生信息。

  9. 查找学生信息函数Search(),输入要查找的学生姓名,遍历链表找到该学生的信息并输出。

  10. 按总分排序函数Sort(),使用冒泡排序法按学生总分从高到低排序。

  11. 程序结束。

本程序主要使用了链表的插入、删除、遍历等操作,以及动态内存分配和字符串处理等知识,是一个较为完整的C语言综合应用题目。

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

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;

//函数声明 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); //总分排序 函数声明

int main() {

system('color F0');  //白底黑色
printf('			|           《C语言课程设计》           |

'); //进入时界面 printf(' | 学生成绩管理系统 | '); printf(' | 学院:国防教育学院 | '); printf(' | 专业:电气自动化 | '); printf(' | 班级:2240804 | '); printf(' | 姓名:胡霄宇 | '); printf(' | 学号:2022320092 | '); int Item; //保存操作命令 pnode phead=NULL; //定义一个指针 while(1) {

printf('

'); printf(' ============================================ ');//操作界面 printf(' | | '); printf(' | 欢迎来到学生成绩管理系统 | '); printf(' | | '); printf(' |==========================================| '); printf(' | 请选择要操作的命令 | '); printf('
'); printf(' 1.录入学生信息
'); printf(' 2.显示学生信息
'); printf(' 3.增加学生信息
'); printf(' 4.删除学生信息
'); printf(' 5.修改学生信息
'); printf(' 6.查找学生信息
'); printf(' 7.按总分排序
'); printf(' 8.退出
');

	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);
		}
		case 8:
        {
         printf('程序以退出"');
         return 0;
         }
		
		default: printf('输入无效请重新输入'); break;
	    
		
	}
}
system('pause');

} //录入学生信息函数编写 pnode Input() { int num;//学生的人数 node stu;//学生结构 pnode phead=(pnode)malloc(sizeof(node));//定义一个头结点并且为头结点分配内存 //判断内存是否为空 if(NULL==phead) { printf('内存分配失败,程序终止! '); 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('内存分配失败,程序终止! '); 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('姓名  学号 计算机 高数  大英 总分 平均分

'); while(NULL!=p) { printf('%s %d %g %g %g %g %g ',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('插入结点的位置不存在! '); return; } printf('你将在第%d个学生后面插入一个学生 ',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('动态内存分配失败,程序终止! '); 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('没找到需要删除的学生的编号! '); return; } pnode q=p->pnext; p->pnext=q->pnext; free(q); q==NULL; printf('你已经成功删除了第%d个学生的信息! ',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(' 姓名 学号 计算机 高数 大英 总分 平均分 '); printf(' 修改前的学生信息! '); printf('%s %d %g %g %g %g %g ',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('姓名 学号 计算机 高数 大英 总分 平均分 '); while(NULL!=p) { if(0==strcmp(Name,p->st.Name)) { printf('%s %d %g %g %g %g %g ',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.Totalst.Total)//当前一个学生的总分小于后一个学生的总分时 { temp.st=p->st; //交换学生的位置 p->st=q->st; q->st=temp.st; } } }

C语言学生成绩管理系统设计思路 - 链表实现

原文地址: https://www.cveoy.top/t/topic/orgg 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录