数据结构(学习)2024.8.6(顺序表)

        今天开始学习数据结构的相关知识,大概分为了解数据结构、算法;学习线性表:顺序表、链表、栈、队列的相关知识和树:二叉树、遍历、创建,查询方法、排序方式等。

目录

一、数据结构

数据

逻辑结构

1.线性结构

2.树形结构

3.图状结构

存储结构

1.顺序存储结构

2.链式存储结构

3.索引存储结构

4.散列存储

操作(数据的运算)

二、算法

算法与程序

算法与数据结构

算法的特性

判断算法好坏的标准

时间复杂度

计算大O的方法 

空间复杂度

算法占用的存储空间包括

三、线性表

顺序表

特点

函数名命名规则

顺序表的相关操作案例

顺序表总结

一、数据结构

        数据的逻辑结构、存储结构及操作(数据运算)

数据

数据:不再是单一的数值,而是类似于集合的概念  
数据元素:是数据的基本单位,由若干个数据项组成 
数据项:是数据的最小单位,描述数据元素信息     

节点:就是数据元素

逻辑结构

        逻辑结构:元素与元素之间的关系

1.线性结构

线性关系 -------> 线性结构 -------> 一对一 -------> 线性表:顺序表、链表、栈、队列

2.树形结构

层次关系 -------> 树形结构 -------> 一对多 -------> 树

3.图状结构

网状关系 -------> 图状结构 -------> 多对多 -------> 图

存储结构

        存储结构:数据的逻辑结构在计算机中的具体实现    

1.顺序存储结构

        数组:在内存当中一段连续的内存空间中保存数据(如c语言中的一维数组) 

2.链式存储结构

        特点:数据在内存中是不连续的,通过指针进行连接

链表结构体:
struct  node_t
{
    int data;        //数据域
    struct  node_t *next;        //指针域, 指向自身结构体类型的指针
};

3.索引存储结构

        提高查找速度                    

        索引表  +    数据文件 
        姓氏 + 地址  名字 + 电话号码 

4.散列存储

        数据在存储的时候与关键码之间存在某种对应关系            

        按照对应关系存取

操作(数据的运算)

        增、删、改、查

二、算法

        解决问题的思想方法

算法与程序

        程序:用计算机语言对算法的具体实现

算法与数据结构

        算法 + 数据结构 = 程序

算法的设计:取决于选定的逻辑结构
算法的实现:依赖于采用的存储结构(顺序存储、链式存储)

算法的特性

1.有穷性         //算法的执行步骤是有限的
2.确定性         //每一个步骤都有明确含义,无二义性
3.可行性         //能够在有限的时间内完成
4.输入

5.输出

判断算法好坏的标准

正确性        //保证算法可以正确的实现想要的功能

易读性        //容易被解读

健壮性        //要有容错处理

高效性        //可执行语句重复的次数(时间复杂度)

低存储性        //占用空间越少越好

时间复杂度

        算法的可重复执行语句执行的次数

        通常时间复杂度用一个问题规模函数来表达    

        T(n) = O(f(n))

T(n)        //问题规模的时间函数
n        //问题规模,输入量的大小
O        //时间数量级
f(n)        //算法的可执行语句重复执行的次数  用问题规模n的某个函数f(n)来表达

计算大O的方法 

(1)根据问题规模n写出表达式 f(n)
(2)只保留最高项,其它项舍去
(3)如果最高项系数不为1,除以最高项系数
(4)如果有常数项,将其置为1 //当f(n)的表达式中只有常数项的时候时有意义的

例如:如果f(n)=8        则O(f(n))----->O(1)

           如果f(n) = 3*n^5 + 2*n^3 + 6*n^6 + 10        则O(f(n))----->O(n^6)

空间复杂度

        算法占用的空间大小。一般将算法的辅助空间作为衡量空间复杂度的标准。

算法占用的存储空间包括

1.输入输出数据所占空间
2.算法本身所占空间
3.额外需要的辅助空间

三、线性表

顺序表、单向链表、单向循环链表、顺序栈、链式栈、循环队列、链式队列、双向链表、双向循环链表

逻辑结构:线性结构
存储结构:顺序、链式
特点:一对一、每一个节点最多有一个前驱和一个后继,首节点无前驱,尾节点无后继

顺序表

特点

        内存连续(数组)

1.逻辑结构:线性结构
2.存储结构:顺序存储
3.操作:增删改查

函数名命名规则

下滑线法:create_empty_seqlist
小驼峰法:createEmptySeqList
大驼峰法:CreateEmptySeqList

顺序表的相关操作案例

头文件seqlist.h:

#ifndef _SEQLIST_H__
#define _SEQLIST_H__
#include <stdio.h>
#include <stdlib.h>
#define N 5
typedef struct seq
{int data[N];int last;
} seqlist_t;// 1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist(); // 返回的是申请空间的首地址
// 2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data); // post第几个位置,data插入的数据
// 3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t *p);
// 4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t *p);
// 5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p);
// 6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t *p, int post);
// 7.清空顺序表
void ClearSeqList(seqlist_t *p);
// 8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p, int post, int data); // post被修改的位置,data修改成的数据
// 9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p, int data); // data代表被查找的数据#endif

顺序表函数seqlist.c:

#include "seqlist.h"
// 1.创建一个空的顺序表
seqlist_t *CreateEpSeqlist() // 返回的是申请空间的首地址
{// 1.动态申请一个结构体大小的空间seqlist_t *p = (seqlist_t *)malloc(sizeof(seqlist_t));if (p == NULL){perror("CreateEpSeqlist函数出错");return NULL;}// 2.对last初始化p->last = -1; // 表示当前数组为空,有效元素个数为0return p;
}// 2.向顺序表的指定位置插入数据
int InsertIntoSeqlist(seqlist_t *p, int post, int data) // post第几个位置,data插入的数据
{// 0.容错判断if (post > (p->last + 1) || post < 0 || IsFullSeqlist(p) == 1){perror("InsertIntoSeqlist函数出错");return -1;}// 1.将last--->post位置整体向后移动一个单位for (int i = p->last; i >= post; i--){p->data[i + 1] = p->data[i];}// 2.将数据插入顺序表p->data[post] = data;// 3.最后一个有效元素下标++p->last++;return 0;
}// 3.遍历顺序表sequence 顺序 list 表
void ShowSeqlist(seqlist_t *p)
{for (int i = 0; i <= p->last; i++){printf("%d ", p->data[i]);}printf("\n");
}// 4.判断顺序表是否为满,满返回1 未满返回0
int IsFullSeqlist(seqlist_t *p)
{return p->last == N - 1;
}// 5.判断顺序表是否为空
int IsEpSeqlist(seqlist_t *p)
{return p->last == -1;
}// 6.删除顺序表中指定位置的数据post删除位置
int DeletePostSeqlist(seqlist_t *p, int post)
{// 0.容错判断if (post >= p->last + 1 || post < 0 || IsEpSeqlist(p)){perror("DeletePostSeqlist函数出错");return -1;}// 1.将post+1--->last位置整体向前移动一个单位for (int i = post + 1; i <= p->last; i++){p->data[i - 1] = p->data[i];}// 2.最后一个有效元素下标--p->last--;return 0;
}// 7.清空顺序表
void ClearSeqList(seqlist_t *p)
{p->last = -1;
}// 8.修改指定位置的数据
int ChangePostSeqList(seqlist_t *p, int post, int data) // post被修改的位置,data修改成的数据
{if (post >= (p->last + 1) || post < 0 || IsEpSeqlist(p)){perror("ChangePostSeqList函数出错");return -1;}p->data[post] = data;return 0;
}// 9.查找指定数据出现的位置
int SearchDataSeqList(seqlist_t *p, int data) // data代表被查找的数据
{int n = -1; // 初始化为-1,表示未找到该数据for (int i = 0; i <= p->last; i++){if (data == p->data[i]){n = i; // 找到数据,记录下标printf("该数据的下标为:%d\n", n);break; // 找到即可跳出循环}}if (n == -1){printf("数组没有该数据\n");}return 0;
}

主函数:main.c:

#include "seqlist.h"
int main()
{seqlist_t *s = CreateEpSeqlist();InsertIntoSeqlist(s, 0, 1);InsertIntoSeqlist(s, 1, 2);InsertIntoSeqlist(s, 2, 3);InsertIntoSeqlist(s, 3, 4);printf("原始数组为:\n");ShowSeqlist(s);int post;int data;printf("请输入你要插入的位置和数据\n");scanf("%d %d", &post, &data);InsertIntoSeqlist(s, post, data);printf("插入以后的数组为:\n");ShowSeqlist(s);printf("请输入你要删除的位置\n");scanf("%d", &post);DeletePostSeqlist(s, post);printf("删除以后的数组为:\n");ShowSeqlist(s);printf("请输入你要修改的位置和数据\n");scanf("%d %d", &post, &data);ChangePostSeqList(s, post, data);printf("修改以后的数组为:\n");ShowSeqlist(s);printf("请输入你要查找的数据\n");scanf("%d", &post);SearchDataSeqList(s, post);printf("清空数据表\n");ClearSeqList(s);printf("清空以后的数据表为:\n");ShowSeqlist(s);printf("释放*s的空间\n");free(s);return 0;
}

makefile:

CC=gcc
CFLAGS=-c -g -Wall
OBJS=main.o seqlist.oseqlist:$(OBJS)$(CC) $^ -o $@
%.o:%.c$(CC) $(CFLAGS) $< -o $@.PHONY:clean
clean:$(RM) *.o seqlist

顺序表总结

1.顺序表在内存中是连续存储的

2.顺序表的长度是固定的

3.顺序表查找和修改数据操作比较方便,插入和删除操作比较麻烦

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu20.04 源码安装 OMPL 与 Moveit

文章目录 一、源码安装OMPL1.1 先检查是否已安装二进制 ompl1.2 若已经提前安装二进制&#xff0c;需先行卸载1.3 OMPL官网安装教程 二、源码安装 moveit2.1 先检查是否已安装二进制Moveit2.2 源码安装 Moveit2.2.1、更新软件包2.2.2、安装依赖2.2.3、创建Moveit工作空间2.2.4…

<Qt> 系统 - 文件

目录 一、Qt文件概述 二、输入输出设备类 三、文件读写类 四、文件和目录信息类 一、Qt文件概述 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 提供了很多关于文件的类&#xff0c;通过这些类能够对文件系统进行操…

Openlayers6 图形绘制和修改功能(结合React)

Openlayers常用的API了解的差不多了&#xff0c;就开始进入实战了&#xff0c;首先从绘制基本的图形开始&#xff0c;这里主要介绍一下绘制圆形、矩形和多边形。 通过使用openlayers的ol.interaction.Draw和ol.interaction.Modify模块实现地图上绘制圆形、矩形、多边形并修改编…

mesh格式转换:glb转ply——使用Blender烘焙贴图到顶点色

1. 导入glb文件 选择shading后&#xff0c;选中物体&#xff0c;就能看到下面的节点树。 2. 创建顶点颜色 这个时候我们可以看到模型的顶点颜色是纯白色的。 2. 将贴图付给材质 原来&#xff1a; 现在&#xff1a; 3. 切换渲染器并烘焙顶点颜色 第三行选择CPU渲染或者GPU…

论文阅读:一种基于凸规划的高效有向最密子图发现方法 | SIGMOD 2022

论文概述 这篇论文的主题是研究如何在有向图中找到密度最高的子图&#xff0c;这个问题被称为有向最密子图&#xff08;Directed Densest Subgraph, DDS&#xff09;问题。该问题在许多应用中非常重要&#xff0c;如社交网络分析、社区发现、假粉丝检测等。论文提出了一种基于…

AI for reading ML paper

心流 心流 Kimi Kimi Humata Humata Bytez Bytez Chatgpt4 scholar 学术版chatgpt4&#xff0c;需要充值&#xff1b; 还有更多AI工具等待你发现&#xff1b;

sqlserver清理数据库日志并写作业定期执行

清理数据库日志最终sql&#xff1a; USE [master] GO ALTER DATABASE lsrz_zjwb_w SET RECOVERY SIMPLE WITH NO_WAIT GO ALTER DATABASE lsrz_zjwb_w SET RECOVERY SIMPLE --简单模式 GO USE lsrz_zjwb_w GO DBCC SHRINKFILE (Nlsrz_zjwb_log , 2, TRUNCATEONLY) --日志文件…

【网络】IO

IO 一、五种IO模型同步通信 vs 异步通信阻塞 vs 非阻塞 二、其他高级IO非阻塞IOSetNoBlockI/O多路转接之selectselect函数原型fd_set&#xff08;位图&#xff09;select代码select缺点poll&#xff08;用select修改&#xff09; I/O多路转接之epoll高级版改进select和poll的问…

企业如何组建安全稳定的跨国通信网络

当企业在海外设有分公司时&#xff0c;如何建立一个安全且稳定的跨国通信网络是一个关键问题。为了确保跨国通信的安全和稳定性&#xff0c;可以考虑以下几种方案。 首先&#xff0c;可以在分公司之间搭建虚拟专用网络。虚拟专用网络通过对传输数据进行加密&#xff0c;保护通信…

前端vue项目——打包部署(nginx中部署静态资源)

1、当前的开发方式 前端人员开发前端&#xff0c;后端人员开发后端的java工程&#xff0c;最终要将开发完毕的前端工程和后端工程分开部署在对应的服务器上&#xff08;前端流行的nginx&#xff09; 2、打包 &#xff08;1&#xff09;原理 &#xff08;2&#xff09; &#xf…

java实现七牛云内容审核功能,文本、图片和视频的内容审核(鉴黄、鉴暴恐、敏感人物)

目录 1、七牛云内容审核介绍 2、查看内容审核官方文档 2.1、文本内容审核 2.1.1、文本内容审核的请求示例 2.1.2、文本内容审核的返回示例 2.2、图片内容审核 2.2.1、请求参数 2.2.2、返回参数 2.3、视频内容审核 3、代码实现 3.1、前期代码准备 3.2、文本内容审核…

Scrapy框架进行数据采集详细实现

摘要 本项目是python课程的课程项目&#xff0c;在简要学习完python和爬虫相关的Scrapy框架后&#xff0c;基于这两者的运用最终完成了对于北京链家网站新房页面的信息进行爬取&#xff0c;并将爬取的数据存放于excel之中&#xff0c;可使用excel或者wps进行查看。 1 引言 1…

HYDRUS2D/3D模型技术教程

原文链接&#xff1a;HYDRUS2D/3D模型技术教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247612514&idx6&snadf080ddb3394d2f758fc269fa6ce9dc&chksmfa827985cdf5f093af1410f151e11fb6d4b39e7533f401624dc2a2375bdcc74b4b0f6160c58b&token1585…

论文分享 | Fuzz4All: 基于大语言模型的通用模糊测试

大语言模型是当前最受关注的研究热点&#xff0c;基于其生成和理解能力&#xff0c;对现有领域在提升性能和效果上做更多尝试。分享一篇发表于2024年ICSE会议的论文Fuzz4All&#xff0c;它组合多个大语言模型以非常轻量且黑盒的方式&#xff0c;实现了一种跨语言和软件的通用模…

适合所有人的生成式人工智能-学习先导课

欢迎来到为所有人提供的生成式人工智能课(generative AI )。自ChatGPT发布以来&#xff0c;人工智能特别是生成式人工智能引起了许多个人、企业和政府的关注。 这是一项非常颠覆性的技术&#xff0c;已经在改变许多人的学习和工作方式。许多开发者认为生成式AI将使许多人得以赋…

[240812] X-CMD 发布 v0.4.5:更新 gtb、cd、chat、hashdir 模块功能

目录 &#x1f4c3;Changelog✨ gtb✨ cd✨ chat✨ hashdir &#x1f4c3;Changelog ✨ gtb 调整了 fzf 预览窗口中书籍文本的显示效果&#xff0c;通过识别文本中的特殊字符、日期、章节标题等信息&#xff0c;为其赋予不同的颜色。 ✨ cd cd 模块新增功能&#xff1a;在找…

RS®ZN-Z8x 开关矩阵

R&SZN-Z8x 开关矩阵 专为多端口矢量网络分析仪测量而设计 R&SZN-Z8x 开关矩阵经过优化设计&#xff0c;专门用于罗德与施瓦茨的矢量网络分析仪。这款经济高效的多方位解决方案可用于多端口设备或多个设备的简单和复杂的测量任务。开关矩阵支持宽频率范围&#xff0…

【论文阅读】YOLOv10: Real-Time End-to-End Object Detection

题目&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 作者&#xff1a;Ao Wang Hui Chen∗ Lihao Liu Kai Chen Zijia Lin Jungong Han Guiguang Ding∗ 清华大学的 motivation: 作者觉得YOLO系列的NMS和某些结构非常的耗时&#xff0c;提出NMS-free和一些列高效…

Qt编译配置OpenCV+opencv_contrib(使用cmake)

本文使用环境 OpenCV: 4.7.0 cmake: 3.30.2 Qt: 5.12.1一、配置环境变量 安装好OpenCV、Qt、cmake后&#xff0c;应配置好一下环境变量&#xff1a; 二、编译OpenCV 打开cmake&#xff0c;编译的源码路径选择opencv文件夹中的sources目录&#xff0c;在opencv文件夹下新建一…

视频汇聚平台智能边缘分析一体机分析平台摄像头异常位移算法识别检测

智能边缘分析一体机在摄像头异常位移检测方面扮演着关键角色&#xff0c;它利用先进的图像处理技术和机器学习算法来实时监测摄像头状态&#xff0c;判断是否发生了非预期的位移。下面是智能边缘分析一体机如何检测摄像头异常位移的详细步骤&#xff1a; 1. 图像帧对比&#x…