数据结构day3

一、思维导图

二、顺序表实现学生管理系统

//头文件

#ifndef TEST_H
#define TEST_H
#define MAX_SIZE 100

//定义学生类型
typedef struct
{
	char name[20]; 		//姓名
	int age; 			//年龄
	double score; 		//分数
}datatype;

//定义班级类型
typedef struct
{
	datatype student[MAX_SIZE]; 	//定义学生容器
	int size; 		 		//实际学生人数
}class,*class_ptr;

//函数声明
//创建班级函数
class_ptr Create_Stu();

//判空函数
int Empty(class_ptr P);

//判满函数
int Full(class_ptr P);

//信息录入
int Enter_Stu(class_ptr P);

//学生信息输出
void Print_Stu(class_ptr P);

//按姓名查找学生位置
int Search_name(class_ptr P,const char *ptr);

//按位置输出学生信息
void Print_pos(class_ptr P,int pos);

//按位置修改学生新信息
int Update_pos(class_ptr P,int pos);

//按位置删除学生信息
int Delete_pos(class_ptr P,int pos);

//学生信息去重
int Unique(class_ptr P);

//按成绩降序排序
void Sort_Stu(class_ptr P);

//输出成绩最值学生信息
void Print_Best(class_ptr P);

//销毁班级容器
void destroy(class_ptr P);

#endif

//功能函数

#include <myhead.h>
#include "sys.h"

//创建班级
class_ptr Create_Stu()
{
	//申请堆区空间
	class_ptr P = (class_ptr)malloc(sizeof(class));
 	if(NULL == P)
	{
		printf("创建失败\n");
		return NULL;
	}
	//申请成功
	//给申请空间初始化
	memset(P,0,sizeof(class));
    P->size =0;

	//将内存地址返回
	printf("创建班级成功\n");
	return P;
}

//判空函数
int Empty(class_ptr P)
{
    return P->size ==0;    
}

//判满函数
int Full(class_ptr P)
{
    return P->size ==MAX_SIZE;    
}

//信息录入
int Enter_Stu(class_ptr P)
{
	//判断合法性
	if(NULL == P || Full(P))
    {
        printf("error\n");
        return -1 ;
    }

	//录入学生信息
		
		printf("请输入学生姓名:");
		scanf("%s",P->student[P->size].name);
		getchar();

		printf("请输入学生年龄:");
		scanf("%d",&P->student[P->size].age);
		getchar();

		printf("请输入学生成绩:");
		scanf("%lf",&P->student[P->size].score);
		getchar();

		printf("\n");

	//录入完成
    //长度增加
    P->size++;
	printf("录入成功\n");
    return 0;
}

//学生信息输出
void Print_Stu(class_ptr P)
{
	//判断合法性
	if(NULL == P || Empty(P))
    {
        printf("error\n");
        return;
    }

	//循环输出学生信息
	printf("**********学生信息如下*********\n");
	printf("姓名\t年龄\t成绩\n\n");
	for(int i=0;i<P->size;i++)
	{
		printf("%s\t%d\t%lf\n",\
				P->student[i].name,P->student[i].age,P->student[i].score);
		printf("\n");
	}
}

//按姓名查找学生位置
int Search_name(class_ptr P,const char *ptr)
{
    //判断合法性
	if(NULL == P || Empty(P))
    {
        printf("error\n");
        return 0 ;
    }

    //遍历查找
    for(int i =0;i<P->size;i++)
    {
        if(strcmp(P->student[i].name , ptr ) == 0)
        {
            //查找成功,返回下标 
            return i;
        }   
    }
	return -1;
}

//按位置输出学生信息
void Print_pos(class_ptr P,int pos)
{
    //判断合法性
	if(NULL == P || Empty(P) || pos < 0 || pos>P->size)
    {
        printf("error\n");
        return ;
    }

    //输出信息
    printf("**********学生信息如下*********\n");
	printf("姓名\t年龄\t成绩\n\n");
	printf("%s\t%d\t%lf\n",\
				P->student[pos].name,P->student[pos].age,P->student[pos].score);
		printf("\n");
}

//按位置修改学生新信息
int Update_pos(class_ptr P,int pos)
{
   //判断合法性
	if(NULL == P  || pos < 0 || pos>P->size)
    {
        printf("error\n");
        return -1;
    }

    //按位置重新输入刷新学生信息
   		printf("请输入新学生姓名:");
		scanf("%s",P->student[pos].name);
		getchar();

		printf("请输入新学生年龄:");
		scanf("%d",&P->student[pos].age);
		getchar();

		printf("请输入新学生成绩:");
		scanf("%lf",&P->student[pos].score);
		getchar();

		printf("修改成功\n");

        return 0;
}

//按位置删除学生信息
int Delete_pos(class_ptr P,int pos)
{
   //判断合法性
	if(NULL == P  || Full(P) || pos < 0 || pos>P->size)
    {
        printf("error\n");
        return -1;
    }

    //删除
    for(int i=pos+1;i<P->size;i++)
    {
        P->student[i-1] =  P->student[i];
    }

	//删除成功
	P->size--;
	printf("删除成功\n");
	return 0;
}

//学生信息去重

//按成绩降序排序
void Sort_Stu(class_ptr P)
{
	//判断合法性
	if(NULL == P || Full(P))
    {
        printf("error\n");
        return;
    }
	 printf("************对学生成绩进行排序***********\n");   
	for(int i=1;i<P->size;i++)
	{
		for(int j=0;j<P->size;j++)
		{
			if(P->student[j].score < P->student[j+1].score)
			{
				//交换位置
				datatype temp = P->student[j];
				P->student[j] = P->student[j+1];
				P->student[j+1] = temp;
			}
		}
	}
	//排序成功
	printf("排序成功\n");
}

//输出成绩最值学生信息
void Print_Best(class_ptr P)
{
	//判断是否成功申请内存
	if(NULL == P)
    {
        printf("error\n");
        return ;
    }

	//定义最值学生容器
	datatype stu_max;
	datatype stu_min;

	//定义最值分数容器
	double max_score = 0;
	double min_socre = 0;

	//将第一个学生当做最值
	stu_max = *P->student;
	stu_min = *P->student;
	max_score = P->student[0].score;
	min_socre = P->student[0].score;

	//循环比较刷新最值
	for(int i=1;i<P->size;i++)
	{
		if(P->student[i].score > max_score)
		{
			max_score = P->student[i].score;
			stu_max = P->student[i];
		}
		if(P->student[i].score < min_socre)
		{
			min_socre = P->student[i].score;
			stu_min = P->student[i];
		}
	}
	//输出成绩最值学生信息
    printf("************成绩最值学生信息************\n");
	printf("成绩最高学生信息:\n");
	printf("姓名\t年龄\t成绩\n\n");
	printf("%s\t%d\t%lf\n",\
			stu_max.name,stu_max.age,stu_max.score);

	printf("成绩最低学生信息:\n");
	printf("姓名\t年龄\t成绩\n\n");
	printf("%s\t%d\t%lf\n",\
				stu_min.name,stu_min.age,stu_min.score);
}

//销毁班级容器
void destroy(class_ptr P)
{
	//释放内存
	if(P != NULL)
	{
		free(P);
		P = NULL;
	}
}

//主函数

#include <myhead.h>
#include "sys.h"

int  main(int argc, const char *argv[])
{
	printf("\t\t************学生信息管理系统************\n");
	printf("\t\t=======1、        创建班级          =======\n");
	printf("\t\t=======2、      录入学生信息        =======\n");
	printf("\t\t=======3、      浏览学生信息        =======\n");
	printf("\t\t=======4、      查找学生信息        =======\n");
	printf("\t\t=======5、      修改学生信息        =======\n");
	printf("\t\t=======6、      删除学生信息        =======\n");
	printf("\t\t=======7、   学生成绩降序排序       =======\n");
	printf("\t\t=======8、  输出成绩最值学生信息    =======\n");			
	printf("\t\t=======9、       销毁班级           =======\n");			
	printf("\t\t=======0、         退出             =======\n");			
	//菜单
	int menu =0;
	char value[20];
	//定义指针接收申请的班级结构体内存
	class_ptr P = NULL;

	do
	{
		printf("请输入选项>>>");
		scanf("%d",&menu);
		getchar();

		//多分支选择执行对应功能
		switch(menu)
		{
		case 1://创建班级
				//指针接收申请的班级结构体内存
				 P =Create_Stu();

				break;
		case 2://录入学生信息
				Enter_Stu(P);
				break;
		case 3://浏览学生信息
				Print_Stu(P);
				break;
		case 4://查找学生信息
				{
				printf("请输入您需要查找的学生姓名:");
				scanf("%s",value);
				getchar();
				//按姓名查找学生位置
				int res4 = Search_name(P,value);
				//按位置输出学生信息
				Print_pos( P,res4);
				}
				break;
		case 5://修改学生信息 
				{
				printf("请输入您需要修改的学生姓名:");
				scanf("%s",value);
				getchar();
				//按姓名查找学生位置
				int res5 = Search_name(P,value);
				//按位置修改学生新信息
				Update_pos(P,res5);
				}
				break;
				
		case 6://删除学生信息 
				{
				printf("请输入您需要删除的学生姓名:");
				scanf("%s",value);
				getchar();
				//按姓名查找学生位置
				int res6 = Search_name(P,value);
				//按位置删除学生新信息
				Delete_pos(P,res6);
				}
				break;
		case 7://按成绩降序排序
				 Sort_Stu(P);
				 //输出排序后信息
				 Print_Stu(P);
				break;
		case 8://输出成绩最值学生信息
				Print_Best(P);
				break;
		case 9://销毁班级容器
				destroy(P);
				P = NULL;
				printf("销毁成功\n");
				break;
		case 0://退出
				break;
		default:
				printf("输入错误,请重新输入\n");
				break;
		}

	} while(menu !=0);

	return 0;
}

相关推荐

  1. 数据结构DAY3--栈与队列

    2024-07-22 00:26:01       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 00:26:01       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 00:26:01       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 00:26:01       45 阅读
  4. Python语言-面向对象

    2024-07-22 00:26:01       55 阅读

热门阅读

  1. 计算并输出杨辉三角形的前10行

    2024-07-22 00:26:01       21 阅读
  2. 线程局部变量共享 -- 使用ThreadLocal解决该需求

    2024-07-22 00:26:01       15 阅读
  3. 内联汇编清楚变量指定位

    2024-07-22 00:26:01       18 阅读
  4. 信竞2024年csp-j模拟赛第二场赛后总结

    2024-07-22 00:26:01       22 阅读
  5. 《C++并发编程实战》笔记(三)

    2024-07-22 00:26:01       19 阅读
  6. 决策树:简单而强大的机器学习算法

    2024-07-22 00:26:01       20 阅读
  7. 过拟合和欠拟合的解决办法

    2024-07-22 00:26:01       18 阅读
  8. mac电脑显示隐藏文件

    2024-07-22 00:26:01       19 阅读
  9. 十、继承

    2024-07-22 00:26:01       18 阅读
  10. Dubbo 的服务降级

    2024-07-22 00:26:01       17 阅读
  11. iOS 语言基础&初探 Xcode 工具

    2024-07-22 00:26:01       19 阅读