数据结构day3

news2024/11/15 21:22:47

一、思维导图

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

//头文件

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux fork、进程的退出和等待详解

初识fork函数 它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 #include <unistd.h> pid_t fork(void); 返回值&#xff1a;子进程中返回0&#xff0c;父进程返回子进程id&#xff0c;出错返回-1 最简单的fork使用示例 #include<stdi…

初阶数据结构的实现2 双向链表

1.双向链表 1.1 概念与结构 1.2实现双向链表 1.2.1定义程序目标 #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> #include<stdbool.h> typedef int LTDateType; //定义双向链表结构 typ…

list(链表)容器的规则及list的高级排序案例

1.list的基本概念&#xff1a; 功能&#xff1a;将数据进行链式存储 list&#xff08;链表&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表是由一系列节点组成&#xff0c;节点的组成包含存储数据元素的…

秋招提前批:抢占求职先机的绝佳机遇(25届提前批名单公布)

秋招&#xff0c;对于即将毕业的大学生来说&#xff0c;是一场至关重要的求职盛宴。每年的秋季&#xff0c;各大企业纷纷抛出橄榄枝&#xff0c;为应届毕业生提供了众多宝贵的就业机会。然而&#xff0c;在求职的漫漫征途中&#xff0c;秋招是一场关键的战役。而秋招提前批&…

二百四十五、海豚调度器——用DolphinScheduler调度执行复杂的HiveSQL(HQL包含多种海豚无法正确识别的符号)

一、目的 在Hive中完成复杂JSON&#xff0c;既有对象还有数组而且数组中包含数组的解析后&#xff0c;原本以为没啥问题了&#xff0c;结果在DolphinScheduler中调度又出现了大问题&#xff0c;搞了一天、试了很多种方法、死了无数脑细胞&#xff0c;才解决了这个问题&#xf…

fastjson1.2.24 反序列化漏洞复现

fastjson简介 Fastjson 是一个 Java 库&#xff0c;可以将 Java 对象转换为 JSON 格式&#xff0c;当然它也可以将 JSON 字符串转换为 Java 对象。 Fastjson 可以操作任何 Java 对象&#xff0c;即使是一些预先存在的没有源码的对象。 这里json与java对象之间的转换&#xff0…

【GaussDB关键技术原理|高可用】DCF双集群容灾

GaussDB关键技术原理&#xff1a;高性能篇&#xff0c;从GaussDB数据库性能优化系统概述、查询处理综述、高性能关键技术等方面为大家进行了解读&#xff0c;并对高斯数据库性能优化做了总结。本篇将分享GaussDB高可用方面的相关知识&#xff0c;详细介绍GaussDB的DCF与双集群容…

双目相机立体匹配算法概述

这里写目录标题 双目相机立体匹配算法概述1.算法分类2.传统算法2.1 局部算法2.2 全局算法2.3 半全局算法 3.深度学习算法3.1 基于CNN的方法3.2 基于GAN的方法3.3 基于transformer的方法 4.总结5.参考文献 双目相机立体匹配算法概述 双目立体匹配是计算机视觉中的一个重要研究方…

数据挖掘与分析部分实验内容

一、机器学习算法的应用 1. 朴素贝叶斯分类器 相关代码 import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import GaussianNB, MultinomialNB from sklearn.metrics import accuracy_score # 将数据加载到DataFrame中&a…

Stable Diffusion 使用详解(3)---- ControlNet

背景 炼丹师在AI绘画的过程中&#xff0c;由于Stable Diffusion的原理是水滴式的扩散作图原理&#xff0c;其实在前面也有提到&#xff0c;他的发挥是‘不稳定’的&#xff0c;因为你没有办法做到精确控制&#xff0c;只能说是大致符合你的预期。你不能总依赖抽卡固定随机数种…

SpringCloud--负载均衡

目录 前言 一.负载均衡的引入 1.1问题引入 1.2代码修改实现 二.负载均衡介绍 2.1实现负载均衡 2.2负载均衡策略 2.3LoadBalancer 原理 学习专栏&#xff1a;http://t.csdnimg.cn/tntwg 前言 在前面的Eureka当中&#xff0c;我们虽然实现了从注册中心中获取url&#xf…

spark 广播变量broadcast

broadcast使用如下图&#xff0c;可以看到创建broadcast是val barr1 sc.broadcast(arr1)&#xff0c;使用broadcast是barr1.value 创建broadcast是使用的broadcastManager。 BroadcastManager cachedValues变量是map结构&#xff0c;key是broadcastId&#xff0c;强引用&a…

初识C++|模板初阶

&#x1f36c; mooridy-CSDN博客 &#x1f9c1;C专栏&#xff08;更新中&#xff01;&#xff09; 目录 &#x1f349;1. 泛型编程 &#x1f349;2. 函数模板 &#x1f95d;2.1 函数模板概念 &#x1f95d;2.2 函数模板格式 &#x1f95d;2.3 函数模板的原理 &#x1f95…

java题目之数字加密以及如何解密

public class Main6 {public static void main(String[] args) {// 某系统的数字密码&#xff08;大于0&#xff09;&#xff0c;比如1983&#xff0c;采用加密方式进行传输//定义了一个静态数组int []arr{1,9,8,3};//1.加密//先给每位数加上5for (int i 0; i <arr.length …

1997. 孤独的素数(结果有一点问题,希望能一起求解)

问题描述 在一个 &#x1d45b; 行 &#x1d45a;列的矩阵王国中&#xff0c;生活着一些整数&#xff0c;其中一些是素数&#xff0c;一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数&#xff0c;我们就认为这是一个孤独的素数。 比如&am…

Spring Boot + Spring Cloud 入门

运行配置 java -jar spring-boot-config-0.0.1-SNAPSHOT.jar --spring.profiles.activetest --my1.age32 --debugtrue "D:\Program Files\Redis\redis-server.exe" D:\Program Files\Redis\redis.windows.conf "D:\Program Files\Redis\redis-cli.exe" &q…

【零基础必看的前端教程】——JavaScript(四)类型转换

欢迎大家打开前端的新篇章——JavaScript&#xff0c;JavaScript与HTML、CSS合称为前端三大件&#xff0c;JavaScript是前端的重中之重&#xff0c;小洪将继续以零基础视角&#xff0c;带你循序渐进学习前端知识&#xff0c;一看就懂&#xff0c;小白也能转行做前端&#xff01…

基于WebGoat平台的SQL注入攻击

目录 引言 一、安装好JAVA 二、下载并运行WebGoat 三、注册并登录WebGoat 四、模拟攻击 1. 第九题 2. 第十题 3. 第十一题 4. 第十二题 5. 第十三题 五、思考体会 1. 举例说明SQL 注入攻击发生的原因。 2. 从信息的CIA 三要素&#xff08;机密性、完整性、可用性&…

推荐一款基于Spring Boot 框架开发的分布式文件管理系统,功能齐全,非常便捷(带私活源码)

前言 在数字化时代&#xff0c;文件管理是企业和个人用户的基本需求。然而&#xff0c;现有的文件管理系统往往存在一些痛点&#xff0c;如存储空间有限、文件共享困难、缺乏在线编辑功能、移动端适配性差等。这些问题限制了用户在不同设备和场景下的文件处理能力。 为了解决…

spring-retry详解

spring-retry详解 1.引入依赖2.Retryable基础使用3.Recover使用4.Retryable参数详解5.需要注意 重试机制对于大部分场景来说都是必要的&#xff0c;比如同步调用三方接口&#xff0c;三方接口、信息拉取等网络原因突然不通&#xff0c;有了重试就可以多一些容错机制&#xff0c…