qwer275650 2021-06-01 22:08 采纳率: 100%
浏览 314
已结题

C语言用链表做的成绩管理系统的排序功能怎么做?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
typedef struct _Student
{
	char name[20];
	int age;
	int stuNum;
	int Cscore;
	int Mscore;
	int Escore;
	int Gscore;
	double AvgScore;
}Student;
//定义链表的结点
typedef struct _Node
{
	Student stu;//学生-数据域
	struct _Node* pNext;//指向下一个结点的指针
}Node;
//定义头结点
Node* g_pHead = NULL;
//录入学生信息
void inputStudent()
{
	//创建一个结点-动态开辟
	Node* pNewNode = (Node*)malloc(sizeof(Node));
	pNewNode->pNext = NULL;
	//头插法
	if (g_pHead == NULL)//原来什么也没有
	{
		g_pHead = pNewNode;
	}
	else
	{
		pNewNode->pNext = g_pHead;
		g_pHead = pNewNode;
	}
	printf("请输入学生姓名:\n");
	scanf("%s", pNewNode->stu.name);//name是数组名,不用加&
	printf("请输入学生年龄:\n");
	scanf("%d", &pNewNode->stu.age);
	printf("请输入学生的学号:\n");
	scanf("%d", &pNewNode->stu.stuNum);
	printf("请输入学生的C成绩:\n");
	scanf("%d", &pNewNode->stu.Cscore);
	printf("请输入学生的数学成绩:\n");
	scanf("%d", &pNewNode->stu.Mscore);
	printf("请输入学生的英语成绩:\n");
	scanf("%d", &pNewNode->stu.Escore);
	pNewNode->stu.Gscore = pNewNode->stu.Cscore + pNewNode->stu.Mscore + pNewNode->stu.Escore;
	pNewNode->stu.AvgScore = pNewNode->stu.Gscore / 3.0;
	printf("录入完成!\n");
	system("pause");
	system("cls");//清屏
}
//主菜单
void mainMenu()
{
	printf("*\t学生成绩管理系统\t*\n");
	printf("——————————————------\n");
	printf("*\t1.输入学生信息\t\t*\n");
	printf("*\t2.显示学生信息\t\t*\n");
	printf("*\t3.保存学生信息\t\t*\n");
	printf("*\t4.读取学生信息\t\t*\n");
	printf("*\t5.统计记录\t\t*\n");
	printf("*\t6.查找学生信息\t\t*\n");
	printf("*\t7.更新学生信息\t\t*\n");
	printf("*\t8.删除学生信息\t\t*\n");
	printf("*\t9.学生成绩排序\t\t*\n");
	printf("*\t0.退出系统\t\t*\n");
	printf("——————————————------\n");
}
//键盘输入
void keyDown()
{
	char ch = _getch();
	switch (ch)
	{
	case '1'://录入
		inputStudent();
		break;
	case '2'://打印
		printStudent();
		break;
	case '3'://保存
		saveStudent();
		break;
	case '4'://读取
		readStudent();
		break;
	case '5'://统计
		printf("学生总人数为:%d\n", countStudent());
		system("pause");
		system("cls");
		break;
	case '6'://查找
	{
		Node* p = findStudent();
		if (p != NULL)
		{
			printf("学号:%d\t姓名:%s\t年龄:%d\tC成绩:%d\t数学成绩:%d\t英语成绩:%d\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.Cscore, p->stu.Mscore, p->stu.Escore);
		}
		else
		{
			printf("没有找到该学生。\n");
		}
		system("pause");
		system("cls");
		break;
	}
	case '7'://修改
		modifyStudent();
		break;
	case '8'://删除
		deleteStudent();
		break;
	case '9'://排序
		不会;
	case '0'://退出
		exit(0);
		break;
	default:
		printf("输入错误,请重新输入。\n");
		system("pause");
		system("cls");
		break;
	}
}
int main(void)
{
	while (1)
	{
		mainMenu();
		keyDown();
	}
	return 0;
}

case'9'://排序  用以上相同的方法继续下去怎么做?单科排名、平均分排名、总分排名。其他功能不用做

  • 写回答

4条回答 默认 最新

  • qzjhjxj 2021-06-02 00:37
    关注

    供参考,录入(1) 、打印 (2)、排序功能(9),先录入,然后打印看下,再选择排序功能,再打印看下有没有排序:

    //C语言用链表做的成绩管理系统的排序功能怎么做?
    
    
    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct _Student
    {
    	char name[20];
    	int  age;
    	int  stuNum;
    	int  Cscore;
    	int  Mscore;
    	int  Escore;
    	int  Gscore;
    	double AvgScore;
    }Student;
    //定义链表的结点
    typedef struct _Node
    {
    	Student stu;//学生-数据域
    	struct _Node* pNext;//指向下一个结点的指针
    }Node;
    //定义头结点
    Node* g_pHead = NULL;
    //录入学生信息
    void inputStudent()
    {
    	//创建一个结点-动态开辟
    	Node* pNewNode = (Node*)malloc(sizeof(Node));
    	pNewNode->pNext = NULL;
    	//头插法
    	if (g_pHead == NULL)//原来什么也没有
    	{
    		g_pHead = pNewNode;
    	}
    	else
    	{
    		pNewNode->pNext = g_pHead;
    		g_pHead = pNewNode;
    	}
    	printf("请输入学生姓名:\n");
    	scanf("%s", pNewNode->stu.name);//name是数组名,不用加&
    	printf("请输入学生年龄:\n");
    	scanf("%d", &pNewNode->stu.age);
    	printf("请输入学生的学号:\n");
    	scanf("%d", &pNewNode->stu.stuNum);
    	printf("请输入学生的C成绩:\n");
    	scanf("%d", &pNewNode->stu.Cscore);
    	printf("请输入学生的数学成绩:\n");
    	scanf("%d", &pNewNode->stu.Mscore);
    	printf("请输入学生的英语成绩:\n");
    	scanf("%d", &pNewNode->stu.Escore);
    	pNewNode->stu.Gscore = pNewNode->stu.Cscore + pNewNode->stu.Mscore + pNewNode->stu.Escore;
    	pNewNode->stu.AvgScore = pNewNode->stu.Gscore / 3.0;
    	printf("录入完成!\n");
    	system("pause");
    	system("cls");//清屏
    }
    
    
    void swap(Student &stu1,Student &stu2)
    {
         Student temp;
         temp  = stu1;
         stu1  = stu2;
         stu2  = temp;
    }
    void ListSort()
    {
         Node *p=NULL,*pre=NULL;
         for(p = g_pHead; p != NULL && p->pNext!=NULL; p=p->pNext)
             for(pre=p->pNext;pre != NULL; pre=pre->pNext)
                 if(p->stu.AvgScore < pre->stu.AvgScore){  //按平均分排名, 从高到低
                 //if(p->stu.Mscore < pre->stu.Mscore){    //按数学单科排名,从高到低
                    swap(p->stu,pre->stu);
                 }
    }
    
    void printStudent()
    {
        Node *p=g_pHead;
        while(p)
        {
            printf("%s %d %d %d %d %d %d %lf\n",p->stu.name,p->stu.age,p->stu.stuNum,
               p->stu.Cscore,p->stu.Mscore,p->stu.Escore,p->stu.Gscore,p->stu.AvgScore);
            p = p->pNext;
        }
    
    }
    
    //主菜单
    void mainMenu()
    {
    	printf("*\t学生成绩管理系统\t*\n");
    	printf("——————————————------\n");
    	printf("*\t1.输入学生信息\t\t*\n");
    	printf("*\t2.显示学生信息\t\t*\n");
    	printf("*\t3.保存学生信息\t\t*\n");
    	printf("*\t4.读取学生信息\t\t*\n");
    	printf("*\t5.统计记录\t\t*\n");
    	printf("*\t6.查找学生信息\t\t*\n");
    	printf("*\t7.更新学生信息\t\t*\n");
    	printf("*\t8.删除学生信息\t\t*\n");
    	printf("*\t9.学生成绩排序\t\t*\n");
    	printf("*\t0.退出系统\t\t*\n");
    	printf("——————————————------\n");
    }
    //键盘输入
    void keyDown()
    {
    	char ch = _getch();
    	switch (ch)
    	{
    	case '1'://录入
    		inputStudent();
    		break;
    	case '2'://打印
    		printStudent();
    		break;
    	case '3'://保存
    		//saveStudent();
    		break;
    	case '4'://读取
    		//readStudent();
    		break;
    	case '5'://统计
    		//printf("学生总人数为:%d\n", countStudent());
    		system("pause");
    		system("cls");
    		break;
    	case '6'://查找
    	{
    		//Node* p = findStudent();
    		//if (p != NULL)
    		//{
    		//	printf("学号:%d\t姓名:%s\t年龄:%d\tC成绩:%d\t数学成绩:%d\t英语成绩:%d\n", p->stu.stuNum, p->stu.name, p->stu.age, p->stu.Cscore, p->stu.Mscore, p->stu.Escore);
    		//}
    		//else
    		//{
    		//	printf("没有找到该学生。\n");
    		//}
    		system("pause");
    		system("cls");
    		break;
    	}
    	case '7'://修改
    		//modifyStudent();
    		break;
    	case '8'://删除
    		//deleteStudent();
    		break;
    	case '9':
                     ListSort();//排序
    	         break;//不会;
    	case '0'://退出
    		exit(0);
    		break;
    	default:
    		printf("输入错误,请重新输入。\n");
    		system("pause");
    		system("cls");
    		break;
    	}
    }
    
    int main(void)
    {
    	while (1)
    	{
    		mainMenu();
    		keyDown();
    	}
    	return 0;
    }
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月14日

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。