数据结构 day3
目录
思维导图:
学习内容:
1. 顺序表
1.1 概念
1.2 有关顺序表的操作
1.2.1 创建顺序表
1.2.2 顺序表判空和判断满
1.2.3 向顺序表中添加元素
1.2.4 遍历顺序表
1.2.5 顺序表按位置进行插入元素
1.2.6 顺序表任意位置删除元素
1.2.7 按值进行查找位置函数
1.2.8 按位置修改函数
1.2.9 按值修改函数
课外作业:
思维导图:
学习内容:
1. 顺序表
1.1 概念
1. 顺序存储的线性表叫做顺序表
线性表:说明该容器对应的逻辑结构为线性结构
顺序存储:表示存储结构为顺序结构,就是使用连续的存储空间进行操作
2. 连续存储空间:可以使用数组来完成或者使用堆区空间
3. 顺序表的表示方式:除了使用一个连续的内存存储顺序表外,还需要外加一个表示顺序表实际长度的变量完成
4. 对顺序表长度的解析:
1、顺序表的长度能够表示顺序表中实际使用的元素个数
2、也能够表示数组中第一个没有存放数据元素的数组元素下标
3、要遍历整个顺序表时,顺序表的长度是最大上限
5. 顺序表结构体类型
#define MAX 20 //顺序表最大容量
typedef int datatype; //数据元素类型//定义顺序表结构体类型
typedef struct
{datatype data[MAX]; //存放顺序表的数组int len; //顺序表的长度
}SeqList, *SeqListPtr;
1.2 有关顺序表的操作
1.2.1 创建顺序表
1、可以在堆区申请一个顺序表,后面操作时,只需要将该顺序表的起始地址传递即可
2、申请出顺序表的空间后,至少需要对顺序表的长度初始化
例如:
//定义顺序表的创建函数
SeqListPtr list_create()
{//在堆区申请一个顺序表的大小空间SeqListPtr L = (SeqListPtr)malloc(sizeof(SeqList));if(NULL == L){printf("创建失败\n");return NULL;}//程序执行至此,表示顺序表创建成功memset(L->data, 0, sizeof(L->data)); //将数组初始化L->len = 0; //顺序表长度为0printf("创建成功\n");return L;
}
1.2.2 顺序表判空和判断满
1、对于添加顺序表元素的操作而言,需要判断顺序表是否已经满了,如果满了的话,则添加失败
一般情况:len <= MAX
满:len == MAX
2、对于减少顺序表元素的操作而言,需要判断顺序表是否已经空了,如果空了的话,就减少失败
空:len == 0
int list_empty(SeqListPtr L)
{return L->len==0;
}//判满函数,满返回真,非满返回假
int list_full(SeqListPtr L)
{return L->len==MAX;
}
1.2.3 向顺序表中添加元素
1、判断条件:如果顺序表已经满了,就不能进行添加操作
2、每次添加的数据放入到顺序表的最后面,也就是放在len所在的位置
3、添加完元素后,需要将长度增加
//添加元素
int list_add(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_full(L)){printf("添加失败\n");return -1;}//添加逻辑:将要添加的元素放到最后一个位置L->data[L->len] = e;//表的变化L->len++;printf("添加成功\n");return 0;
}
1.2.4 遍历顺序表
1、判断逻辑:表是否合法,表是否为空
2、本质上就是数组的遍历,只是遍历到顺序表的长度结束即可
//遍历顺序表
void list_show(SeqListPtr L)
{//判断逻辑if(NULL == L || list_empty(L)){printf("遍历失败\n");return ;}//遍历printf("顺序表中元素分别是:");for(int i=0; i<L->len; i++){printf("%d\t", L->data[i]);}printf("\n");
}
1.2.5 顺序表按位置进行插入元素
1、 判断逻辑:顺序表不为空,顺序表不满,要插入位置不能小于0,也不能大于len
2、 插入逻辑:需要将从最后一个元素到要插入位置的元素之间所有元素整体向后移动一格
将新元素放入到要插入位置即可
/定义任意位置插入函数
int list_insert_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || list_full(L) || pos<0 || pos>L->len){printf("插入失败\n");return -1;}//腾空逻辑for(int i=L->len-1; i>=pos; i--){L->data[i+1] = L->data[i];//将前面的元素后移}//插入数据L->data[pos] = e;//表长变化L->len++;printf("插入成功\n");return 0;
}
1.2.6 顺序表任意位置删除元素
1、判断逻辑:表是否为空、表是否合法、删除位置是否合法
2、需要将要删除位置后面的元素开始到最后一个位置为止,整体前移动一格
//定义任意位置删除函数
int list_delete_pos(SeqListPtr L, int pos)
{//判断逻辑 if(NULL==L || list_empty(L) || pos<0 || pos>=L->len){printf("删除失败\n");return -1;}//删除逻辑for(int i=pos+1; i<L->len; i++){L->data[i-1] = L->data[i]; //将元素向前偏移}//表长变化L->len --;printf("删除成功\n");return 0;
}
1.2.7 按值进行查找位置函数
//定义按值查找位置函数
int list_search_value(SeqListPtr L, datatype e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("查找失败\n");return -1;}//遍历整个顺序表for(int i=0; i<L->len; i++){if(L->data[i] == e){return i; //返回查找到的数据下标}}printf("没找到\n");return -1;
}
1.2.8 按位置修改函数
//按位置进行修改
int list_update_pos(SeqListPtr L, int pos, datatype e)
{//判断逻辑if(NULL==L || pos<0 || pos>=L->len || list_empty(L)){printf("修改失败\n");return -1;}//正常进行修改L->data[pos] = e;printf("修改成功\n");return 0;
}
1.2.9 按值修改函数
//按值进行修改
int list_update_value(SeqListPtr L, datatype old_e, datatype new_e)
{//判断逻辑if(NULL==L || list_empty(L)){printf("修改失败\n");return -1;}//根据旧值找的位置int res = list_search_value(L, old_e);if(res == -1){printf("没有要修改的值\n");return -1;}//调用函数完成按位置修改list_update_pos(L, res, new_e);printf("修改成功\n");return 0;
}
课外作业:
上节课的作业,加上增删改查方法。
解析:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100 //最大容量//定义学生类型
struct stu
{char name[20];int age;int score;
};
//定义班级类型
struct Class
{struct stu student[MAX]; //存放学生的容器int size; //实际人数
};
struct Class *create(int count){struct Class *cls = (struct Class *)malloc(sizeof(struct Class));cls->size = count;if(NULL == cls){printf("申请失败\n");return NULL;}//程序执行至此,表示内存申请成功//给内存空间进行初始化memset(cls, 0, sizeof(int)*(count));//将内存地址返回return cls;
}int list_empty(struct Class *stu)
{return stu->size ==0;
}int list_full(struct Class *stu)
{return stu->size == MAX;
}//菜单
void print_menu(){printf("\n学生管理系统\n");printf("功能1:完成对学生信息的录入\n");printf("功能2:完成对学生信息的输出\n");printf("功能3:输出成绩最高和最低学生的信息\n");printf("功能4:班级的销毁\n");printf("功能5:对学生信息按成绩进行降序排序\n");printf("功能6:增加一个学生信息\n");printf("功能7:删除一个学生信息\n");printf("功能8:修改一个学生信息\n");printf("功能9:查询一个学生信息\n");printf("功能0:退出\n");printf("请选择操作(0-5):");
}
//定义学生录用信息函数
int enterstu(struct Class *stu){ for (int i = 0; i < stu->size; i++) // 循环遍历输入各个学生信息{printf("输入学生 %d 的姓名:", i + 1);scanf("%s",stu->student[i].name);printf("输入学生 %d 的年龄:", i + 1);scanf("%d",&stu->student[i].age);printf("输入学生 %d 的成绩:", i + 1);scanf("%d",&stu->student[i].score);}
}
//求出学生成绩最大最小值函数
void maxminstu(struct Class *stu){int maxscore=0; //定义初始值int minscore=0; //定义初始值for (int i = 0; i < stu->size; i++) {//判断最大值if(stu->student[i].score >stu->student[maxscore].score) { maxscore = i;}//判断最小值if(stu->student[i].score < stu->student[minscore].score){minscore = i;}}//打印输出成绩最大最小值的信息printf("最高成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[maxscore].name,stu->student[maxscore].age,stu->student[maxscore].score);printf("最低成绩的名字为%s,年龄为%d,成绩为%d\n",stu->student[minscore].name,stu->student[minscore].age,stu->student[minscore].score);
}
//打印学生信息函数
void print_stu(struct Class *stu){if(NULL == stu){printf("error\n");return ;}printf("姓名\t年龄\t成绩\n");for (int i = 0; i < stu->size; i++) // 循环遍历学生信息,打印出来{printf("%s\t%d\t%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}
}
//排序函数
void sortstu(struct Class *stu){for(int i = 1; i < stu->size; i++){ //交换三部曲for(int j = 0; j < stu->size-i; j++){if(stu->student[j].score > stu->student[j+1].score){struct stu temp = stu->student[j];stu->student[j] = stu->student[j+1];stu->student[j+1] = temp;}}}print_stu(stu);
}
//释放内存的函数
void destroy(struct Class *stu)
{//释放内存if(NULL != stu){free(stu); //释放空间stu = NULL;}
}
int stu_insert(struct Class *stu,int pos){if(NULL == stu || list_full(stu) || pos <0 || pos >stu->size){printf("插入失败\n");return -1;}for (int i = stu->size; i > pos; i--){stu->student[i] = stu->student[i-1];}printf("输入学生的姓名:");scanf("%s",stu->student[pos].name);printf("输入学生的年龄:");scanf("%d",&stu->student[pos].age);printf("输入学生的成绩:");scanf("%d",&stu->student[pos].score);stu->size++;printf("插入成功\n");print_stu(stu);return 0;
}
int stu_delete(struct Class *stu,char *value)
{int pos=0;if(NULL == stu || list_empty(stu)){printf("删除失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){pos=i;}}for(int i=pos;i<stu->size;i++){stu->student[i]=stu->student[i+1];}stu->size--;printf("删除成功\n");print_stu(stu);return 0;
}
int stu_update(struct Class *stu ,char *value)
{if(NULL == stu || list_empty(stu) ){printf("修改失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("输入学生的年龄:");scanf("%d",&stu->student[i].age);printf("输入学生的成绩:");scanf("%d",&stu->student[i].score);}}printf("修改成功\n");print_stu(stu);return 0;
}
int stu_seach(struct Class *stu,char *value){if(NULL == stu || list_empty(stu) ){printf("查找失败\n");return -1;}for (int i = 0; i < stu->size; i++){if(strcmp(stu->student[i].name,value) == 0){printf("找到了\n");printf("学生姓名为:%s,年龄为%d,成绩为%d\n",stu->student[i].name,stu->student[i].age,stu->student[i].score);}else{printf("未找到");}}return 0;
}
int main(int argc, char const *argv[])
{int menu=0; int size =0 ;printf("请输入班级实际人数:");scanf("%d",&size); //输入实际人数struct Class *cls = create(size); //获取Classwhile (1){//提示用户输入功能print_menu();scanf("%d",&menu);switch (menu){case 1:enterstu(cls);break;case 2:print_stu(cls);break;case 3:maxminstu(cls);break;case 4:{destroy(cls);cls = NULL;print_stu(cls);}break;case 5:sortstu(cls);break;case 6:{int n=0;printf("请输入你要插入第几个位置:");scanf("%d",&n);stu_insert(cls,n-1);}break;case 7:{char value[MAX]="";printf("请输入你要删除信息的姓名");scanf("%s",value);stu_delete(cls,value);}break;case 8:{char value[MAX]="";printf("请输入你要修改信息的姓名");scanf("%s",value);stu_update(cls,value);}break;case 9:{char value[MAX]="";printf("请输入你要查找的姓名");scanf("%s",value);stu_seach(cls,value);}break;case 0: goto END;default:printf("您输入的功能有误,请重新输入\n");}}END:return 0;
}
相关文章:
数据结构 day3
目录 思维导图: 学习内容: 1. 顺序表 1.1 概念 1.2 有关顺序表的操作 1.2.1 创建顺序表 1.2.2 顺序表判空和判断满 1.2.3 向顺序表中添加元素 1.2.4 遍历顺序表 1.2.5 顺序表按位置进行插入元素 1.2.6 顺序表任意位置删除元素 1.2.7 按值进…...
Kubernetes面试整理-如何进行滚动更新和回滚?
在 Kubernetes 中,滚动更新和回滚是管理应用程序版本的常用操作。滚动更新允许您逐步替换现有的 Pod 实例,以便在不中断服务的情况下部署新版本。回滚则是在新版本出现问题时恢复到之前的版本。 滚动更新 通过 Deployment 进行滚动更新 1. 创建一个 Deployment: 下面是一个…...
flutter ios打包 xcode报错module ‘xxx‘ not found
flutter ios打包 xcode报错module ‘xxx’ not found 如果已经在androidstudio中成功运行了flutter build ios --release。 那么可能是你使用xcode打开的是ios/Runner.xcodeproj文件。 你关掉xcode,重新打开ios/Runner.xcworkspace/文件。然后重新archiveÿ…...
LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)
概述 在先前探讨的文章中,我们构建了一个全面的数据测试体系,该体系遵循“数据获取—数据治理—数据分析”的流程。如何高效地构建数据可视化看板,以直观展现分析结果,正逐渐成为利用新兴技术提升效能的关键领域。伴随业务拓展、数…...
Elasticsearch 批量更新
Elasticsearch 批量更新 准备条件查询数据批量更新 准备条件 以下查询操作都基于索引crm_flow_info来操作,索引已经建过了,本文主要讲Elasticsearch批量更新指定字段语句,下面开始写更新语句执行更新啦! 查询数据 查询指定shif…...
【Pytorch笔记】张量
torch.Tensor() 是 PyTorch 库中用于创建张量的一个函数。在 PyTorch 中,张量是多维数组,它们可以存储在 CPU 或 GPU 上,并且支持自动求导,这使得它们非常适合进行深度学习和科学计算。 张量可以在Python list形式下通过 torch.T…...
查找json中指定节点的值,替换为指定的值
有时我们封装好的实体转化成的json字段的值和第三方要求的不一样,比如我们字段的值是字符串,我们需要使用int类型的值,就需要将这个键的值转化成int类型。 比如将以下 convulsionNumber字段中字符串的值“一次”替换为0 {"convulsionT…...
Android 14 开机时间优化措施
Android开机优化系列文档-CSDN博客 Android 14 开机时间优化措施汇总-CSDN博客Android 14 开机时间优化措施-CSDN博客根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客Android系统上常见的性能优化工具-CSDN博客Android上如何使用perfetto分析systrace-CSDN博客A…...
【QGroundControl二次开发】二.使用QT编译QGC(Windows)
【QGroundControl二次开发】一.开发环境准备(Windows) 二. 使用QT编译QGC(Windows) 2.1 打开QT Creator,选择打开项目,打开之前下载的QGC项目源码。 编译器选择Desktop Qt 6.6.3 MSVC2019 64bit。 点击运…...
[C/C++入门][变量和运算]4、带余除法
给定被除数和除数,求整数商及余数 看到这个题,我们都知道C的除法运算符 /,默认是不带余数的。那现在要求带余数,需要能够想到% %,是C获取余数的方法:比如5/22; 5%21;%得到的是除后的余数。 #inc…...
常用优秀内网穿透工具(实测详细版)
文章目录 1、前言2、安装Nginx3、配置Nginx4、启动Nginx服务4.1、配置登录页面 5、内网穿透5.1、cpolar5.1.1、cpolar软件安装5.1.2、cpolar穿透 5.2、Ngrok5.2.1、Ngrok安装5.2.2、随机域名5.2.3、固定域名5.2.4、前后端服务端口 5.3、NatApp5.4、Frp5.4.1、下载Frp5.4.2、暴露…...
防火墙NAT地址转换和智能选举综合实验
一、实验拓扑 目录 一、实验拓扑 二、实验要求(接上一个实验要求后) 三、实验步骤 3.1办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 3.2分公司设备可以通过总公司的移动链路和电信链路访…...
Android获取当前屏幕显示的是哪个activity
在 Android 中,要获取当前屏幕显示的 Activity,可以使用以下几种方法: 方法一:使用 ActivityManager 获取当前运行的任务信息 这是一个常见的方法,尽管从 Android 5.0 (API 21) 开始,有些方法变得不太可靠…...
JVM:自动垃圾回收
文章目录 一、C/C的内存管理二、Java的内存管理1、方法去的回收2、堆回收(1)引用计数法和可达性分析法(2)五种对象引用(3)垃圾回收算法 一、C/C的内存管理 在C和C没有自动垃圾回收机制,一个对象…...
【填坑指南】PHP8报:Unable to load dynamic library ‘zip.so’ 错误
1.原因分析 这种情况多数发生在PHP安装时因为各种原因失败后,残余的库与最后安装的PHP版本不兼容导致的。 2.我的路径 一开始我按照以前摸索出来的安装PHP7.3的成功经验来编译方法安装PHP8.3,发现以前的套路已经失效了。反复重装PHP8.3失败后…...
鸿蒙语言基础类库:【@system.notification (通知消息)】
通知消息 说明: 从API Version 7 开始,该接口不再维护,推荐使用新接口[ohos.notification]。本模块首批接口从API version 3开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import notification fro…...
1.JavaWeb开发简介(Tomcat安装使用+Servlet简介)
文章目录 一.web开发简介1.概念:2.特点:3.常用技术:4.服务架构5.web应用开发模式6.HTTP协议1)概念:2)HTTP最基本的过程是:3)IP/域名4)HTTP协议请求方式 7.JavaWeb的相关技术8.Java Web服务器 二、安装配置Tomcat1.简介2.Tomcat目录结构 三.Servlet的入门应用1.使用步骤2.使用注…...
xxl-job 动态创建一次性定时任务
文章目录 需求一、考虑方案二、实现思路三、代码实现3.1 引入xxl-core 核心包3.2 远程调用3.2.0 yaml3.2.1 配置类3.2.2 入参3.2.3 任务返回实体3.2.4 任务调用 3.3 cron生成器3.4 handler实现3.4 测试 踩坑 需求 类似预约会议,设置提醒 添加数据记录(…...
网页制作技术:概念、现状与展望?
网页制作技术:概念、现状与展望? 李升伟 网页制作技术是指用于创建和维护网站的一系列技术和方法。 概念: 它涉及多个方面,包括使用 HTML(超文本标记语言)来构建网页的结构和内容,使用 CSS&…...
Kafka Producer之数据重复和乱序问题
文章目录 1. 数据重复2. 数据乱序 为了可靠性,Kafka有消息重试机制,但是同时也带来了2大问题 1. 数据重复 消息发送到broker后,broker记录消息数据到log中,但是由于网络问题,producer没有收到acks,于是再次…...
Java前后端分离开发的步骤以及注意事项
在现代Web应用程序开发中,前后端分离是一种常见的架构模式。这种模式将前端(用户界面)和后端(业务逻辑和数据处理)分开独立开发和部署,从而提高开发效率、代码的可维护性和团队协作能力。本文将介绍Java前后…...
C#绘制阻抗圆图初步
阻抗圆图,或者叫史密斯图,是无线电设计方面用的; 基本的阻抗圆图如下, 下面尝试用C#能不能画一下; 先在网上找一个画坐标的C#类,它的效果如下; 自己再增加一个函数,可以绘制中心在…...
【STC89C51单片机】定时器/计数器的理解
目录 定时器/计数器1. 定时器怎么定时简单理解(加1经过了多少时间)什么是时钟周期什么是机器周期 2.如何设置定时基本结构相关寄存器1. TMOD寄存器2. TCON寄存器 代码示例 定时器/计数器 STC89C51单片机的定时器和计数器(Timers and Counter…...
数据建模标准-关系建模
数据模型定义:DAMA数据治理体系中将数据模型定义为一种文档形式,数据模型是用来将数据需求从业务传递到IT,以及在IT内部从分析师、建模师和架构师到数据库设计人员和开发人员的主要媒介; 作用:记录数据需求和建模过程中产生的数据…...
Qt日志库QsLog使用教程
前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库,这个库有个麻烦的点是要配置config文件,所以这次切换到了QsLog。用了后这个库的感受是,比较轻量级,嘎嘎好用,推荐一波。 下载QsLog库 https://github.c…...
07. Hibernate 会话工厂(SessionFactory)
1. 前言 Hibernate 的核心价值观是:开发者们!做你们应该做的。脏的、累的、没技术含义的由本尊来做。 本节课和大家一起好好的聊聊 Hibernate 的核心组件之一:会话工厂(SessionFactory)。 通过本节课,你…...
使用Nginx实现高效负载均衡
概述 Nginx是一款高性能的HTTP和反向代理服务器,广泛用于Web服务的负载均衡。它能有效分发流量至多个后端服务器,提高网站的可用性和响应速度,同时增强系统的可扩展性和安全性。本文将介绍如何配置Nginx进行负载均衡,并提供具体的…...
华为OD机考题(基础API)
基础API 字典排序 List<String> listnew ArrayList(); //add list member Arrays.sort(list);List<Map<String,Integer>> listnew ArrayList(); //add list member Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {Over…...
<数据集>UA-DETRAC车辆识别数据集<目标检测>
数据集格式:VOCYOLO格式 图片数量:20500张 标注数量(xml文件个数):20500 标注数量(txt文件个数):20500 标注类别数:4 标注类别名称:[car, van, others, bus] 序号类别名称图片数框数1car201871259342…...
学生管理系统(C语言)(Easy-x)
课 程 报 告 课 程 名 称: 程序设计实践 专 业 班 级 : XXXXX XXXXX 学 生 姓 名 : XXX 学 号 : 231040700302 任 课 教 师 &a…...
广西住房与城乡建设厅网站/淄博seo网络公司
查看原文:http://www.sijitao.net/1943.html 先简单说下我碰到的情况。我一个域名的http页面被墙,国内用户可以通过https方式打开。为了seo,也遵循尽量不换网站域名的前提下,现在我想实现的目标是对国外蜘蛛(google...…...
全球网站排名查询/网络营销专业是干嘛的
更多关于Apache ECharts的文档,请阅读: Apache ECharts文档专题 Apache ECharts的特性 Apache ECharts的特性第一部分Apache ECharts的特性第二部分...
icann 域名注册网站/网络推广网站的方法
介绍 使用 karma Jasmine,就可以测试指定的案例, 加入RequireJS, 可以进行测试异步模块的案例安装 # Install Karma: $ npm install karma --save-dev# Install plugins that your project needs: $ npm install karma-jasmine karma-chrome-launcher jasmine-core…...
东莞朝阳网站建设/域名被墙查询
当前输入字符可以分为两种情况: 1、当前输入字符不为空,则直接输出这个字符即可; 2、当前输入字符为空,这种情况又可以分为两种情况: ①、上一个输入字符也为空,则忽略此次输入的空格即可; ②、…...
保险网站模板/互联网推广项目
关键字 const 声明常量。修饰指针,分为指向常量的指针(pointer to const)和自身是常量的指针(常量指针,const pointer);修饰引用,指向常量的引用(reference to const&a…...
付费网站做推广哪个好/网络营销策划总结
lambda函数也叫匿名函数,即,函数没有具体的名称。 glambda x:x**2 def f(x):return x**2 lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边是返回值,lambda语句构建的其实是一个函数对…...