顺序表的定义与实现(数据结构与算法)

一、顺序表的定义

1. 顺序表的定义

在这里插入图片描述

#define MaxSize 10                        //定义最大长度
typedef struct{                           ElemType data[MaxSize];              //用静态的“数组”存放数据元素int length;                          //顺序表的当前长度
}SqList;                                 //顺序表的类型定义(静态分配方式)
2.顺序表的实现---------静态分配

当我们声明一个顺序表的时候,把length值置为0是很有必要的: L.length = 0;

在这里插入图片描述

#include<stdio.h>
#define MaxSize 10                       //定义最大长度
typedef struct{                           ElemType data[MaxSize];              //用静态的“数组”存放数据元素int length;                          //顺序表的当前长度
}SqList;                                 //顺序表的类型定义(静态分配方式)  //基本操作 ------初始化一个顺序表
void InitList(SqList &L)
{for (int i = 0; i < MaxSize; i++)L.data[i] = 0;                  //将所有数据元素设置为默认初始值L.length = 0;                       //顺序表初始长度为0
}
int main()
{SqList L;                        //声明一个顺序表InitList(L);                     //初始化顺序表// ............后续操作return 0;
}
  • 如果“数组”存满了怎么办?
  • 顺序表的表长刚开始确定后就无法更改(存储空间是静态的)
  • 思考:如果刚开始就声明一个很大的内存空间?会存在什么问题? ---------- 浪费!
#define MaxSize 10                   //定义最大长度
typedef struct{ElemType data[MaxSize];         //用静态的“数组”存放数据元素int length;                     //顺序表的当前长度
}SqList;                            //顺序表的类型定义
3. 顺序表的实现---------动态分配
顺序表是一种线性表的存储结构,可以在连续的内存空间中存储元素。动态分配顺序表是指在需要时,根据实际情况动态增加或释放存储空间。

在这里插入图片描述

以下是实现动态分配顺序表的基本步骤:

1.定义结构体或类:首先,需要定义一个结构体或类来表示顺序表,可以包含如下成员:

  • 数据区域的指针,用于存储元素的数组。
  • 当前顺序表的大小(元素个数)。
  • 当前分配的存储空间大小。
  • 其他辅助变量或信息。

2.创建动态顺序表:在内存中分配一定大小的空间作为动态顺序表的初始存储空间,并初始化顺序表的各个成员。可以使用动态内存分配函数(如malloc)来分配空间。

3.插入元素:当需要插入新元素时,按照顺序表的逻辑顺序找到插入位置。如果当前存储空间不足以容纳新元素,则需要进行动态扩容,重新分配更大的存储空间,并将原有的元素复制到新的空间中。

4.删除元素:当需要删除元素时,将待删除元素后面的元素向前移动,填补删除位置,并更新顺序表的大小。如果删除元素后,剩余存储空间占比过低,可以考虑进行动态缩容,释放多余的存储空间。

5.销毁顺序表:当顺序表不再使用时,需要释放占用的内存空间,即使用动态内存释放函数(如free)释放动态顺序表的存储空间。

#define InitSize 10            //顺序表的初始长度
typedef struct{ElemType *data;             //指示动态分配数组的指针int MaxSize;                //顺序表的最大容量int length;                 //顺序表的当前长度
}SeqList;                       //顺序表的类型定义 (动态分配方式)//Key: 动态申请和释放内存空间   
//C---- malloc、free函数L.data = (Elem Type*) malloc(sizeof(ElemType), *InitSize);
//C++---new、delete关键字
  • malloc函数申请的是一整片连续的存储空间,malloc函数返回一个指针,需要强制转换型为你定义的数据元素类型指针。
  • malloc函数的参数,指明要分配多大的连续内存空间。
    在这里插入图片描述
#include<stdlib.h>            //malloc、free函数的头文件
#define InitSize 10          //默认的最大长度
typedef struct{int *data;               //指示动态分配数组的指针		int MaxSize;             //顺序表的最大容量int length;              //顺序表的当前长度
}SeqList;void InitList(SeqList &L){//用malloc函数申请一片连续的存储空间,如下图所示//调用malloc函数,申请一整片连续存储空间,其大小能存的下10个int类型数据。//malloc会返回一个指针类型,将其转换成和int *data;同类型的指针类型(int *),然后将返回值赋值给dataL.data = (int *)malloc(InitSize*sizeof(int));//malloc返回的是开辟的一整片存储空间的起始地址->data[0]L.length = 0;L.MaxSize = InitSize; //将顺序表最大容量设置为初始值
}//增加动态数组的长度
void IncreaseSize(SeqList &L, int len){int *p = L.data;      //将顺序表data指针的值赋给指针p,即p指针和data指向同一个位置//调用malloc函数,申请的另一块内存空间能够存得下当前所有数据元素,再多存5个新的数据元素,//再乘以每个数据元素的大小L.data = (int *)malloc((L.MaxSize + len)*sizeof(int));for(int i = 0; i < L.length; i++){L.data[i] = p[i];     //将数据复制到新区域(时间开销大)}L.MaxSize = L.MaxSize + len;  //顺序表最大长度增加len//free会将p指针所指向的一整片(原空间)释放掉,归还给系统,这样就实现了内存的扩展。  free(p);                //释放原来的内存空间//由于*p是局部变量,在该函数执行完后,*p所在内存空间会被系统自动释放
}int main()
{SeqList L;           //声明一个顺序表,计算机会开辟一小块存储空间用来存储SeqList顺序表InitList(L);         //初始化顺序表//......往顺序表中插入几个元素.......IncreaseSize(L, 5);return 0;
}//realloc函数也可以实现,但建议初学者使用malloc和free更能理解背后的过程。

4.顺序表的实现

顺序表:

  • 随机访问,即可以在O(1)常数级时间内找到第i个元素。 data[i-1]
  • 存储密度高,每个节点只存储数据元素。
  • 扩展容量不方便,(即便采用动态分配的方式实现,扩展长度的时间复杂度也比较高)。
  • 插入删除不方便,需要移动大量元素

:链式存储

  • 除了存储数据元素之外,还需要耗费一定存储空间来存放指针。
    在这里插入图片描述
    顺序表思维导图:
    在这里插入图片描述

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

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

相关文章

SparkSQL的Shuffle分区设定及异常数据处理API(去重、缺失值处理)

一、Spark SQL的Shuffle分区数目设定 二、异常数据处理API &#xff08;1&#xff09;去重方法dropDuplicates &#xff08;2&#xff09;删除有缺失值的行方法dropna &#xff08;3&#xff09;填充缺失值数据fillna 一、Spark SQL的Shuffle分区数目设定 在允许spark程序时&a…

Python实验项目4 :面对对象程序设计

1&#xff1a;运行下面的程序&#xff0c;回答问题。 &#xff08;1&#xff09;说明程序的执行过程&#xff1b; &#xff08;2&#xff09;程序运行结果是什么&#xff1f; # &#xff08;1&#xff09;说明程序的执行过程&#xff1b; # &#xff08;2&#xff09;程序运行…

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求&#xff0c;很多新手不晓得如何入手&#xff0c;难点在于通讯不中断。其实android发展到今天&#xff0c;很多技术都很完善&#xff0c;有很多类似框架可以实现。例如有&#xff1a;okhttp自带的websocket框架、easysocket等等。本文主…

如何做一个无符号数识别程序

1.状态分析 我们可以把无符号数分为&#xff1a;整数&#xff0c;带小数&#xff0c;带指数部分三种形式。以此构建一个DFA。首先需识别输入是整数还是小数点&#xff0c;若是整数部分输入然后还要再循环识别一次是否有小数点&#xff0c;最后识别是否有指数部分&#xff0c;指…

Spring学习笔记—JDK动态代理

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Spring专栏 ✨特色专栏&#xff1a; M…

Redis -- 基础知识2

1.Redis客户端介绍 1.基础介绍 Redis是一种客户端-服务器结构的程序&#xff0c;通过网络进行互动 客户端的多种形态 1.自带了命令行客户端&#xff1a;redis-cil 2.图形化界面的客户端&#xff1a;依赖windows系统&#xff0c;连接服务器有诸多限制&#xff0c;不建议使用 3.基…

打印机连接网络后怎么安装驱动?

打印机在我们办公和生活中算是比较常见的设备&#xff0c;特别是在上班时需要时常打印各种文件&#xff0c;但是有时电脑上的打印机也会有无法打印的问题&#xff0c;或者新买的打印机需要先安装驱动才能正常打印的。 那么这个时候我们需要先检查电脑上的打印机是否有安装驱动&…

正点原子嵌入式linux驱动开发——异步通知

上一篇笔记中使用阻塞或者非阻塞的方式来读取驱动中按键值都是应用程序主动读取的&#xff0c;对于非阻塞方式来说还需要应用程序通过poll函数不断的轮询。最好的方式就是驱动程序能主动向应用程序发出通知&#xff0c;报告自己可以访问&#xff0c;然后应用程序再从驱动程序中…

LCR 146. 螺旋遍历二维数组

LCR 146. 螺旋遍历二维数组 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; LCR 146. 螺旋遍历二维数组 https://leetcode.cn/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/description/ 完成情况&#xff1a; 解…

【Leetcode】【每日一题】【简单】2520. 统计能整除数字的位数

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/count-the-digits-that-divide-a…

网络安全保险行业面临的挑战与变革

保险业内大多数资产类别的数据可以追溯到几个世纪以前&#xff1b;然而&#xff0c;网络安全保险业仍处于初级阶段。由于勒索软件攻击、高度复杂的黑客和昂贵的数据泄漏事件不断增加&#xff0c;许多网络安全保险提供商开始感到害怕继续承保更多业务。 保险行业 根据最近的路…

【方法】如何给PDF文件添加“打开密码”?

PDF文件可以在线浏览&#xff0c;但如果想要给文件添加“打开密码”&#xff0c;就需要用到软件工具&#xff0c;下面小编分享两种常用的工具&#xff0c;小伙伴们可以根据需要选择。 工具一&#xff1a;PDF编辑器 PDF阅读器一般是没有设置密码的功能模块&#xff0c;PDF编辑器…

python自动化测试(二):xpath获取元素

目录 前置代码 一、什么是xpath方式 二、通过xpath 单组属性名属性值 的方式进行元素定位 三、通过xpath的多组属性进行元素的定位 四、通过xpath文本值的方式进行元素定位 五、通过模糊的文本值方式进行元素定位 前置代码 # codingutf-8 from selenium import webdrive…

python树结构包treelib入门及其计算应用

树是计算机科学中重要的数据结构。例如决策树等机器学习算法设计、文件系统索引等。创建treelib包是为了在Python中提供树数据结构的有效实现。 Treelib的主要特点包括&#xff1a; 节点搜索的高效操作。支持常见的树操作&#xff0c;如遍历、插入、删除、节点移动、浅/深复制…

使用Go语言测试Redis性能

1. 前言 Redis是一个高性能的键值存储数据库&#xff0c;常用于缓存、队列、排行榜等场景。在实际应用中&#xff0c;我们需要对Redis的性能进行测试&#xff0c;以便了解其在不同场景下的表现。本文将介绍如何使用Go语言测试Redis的性能。 2. 环境准备 在开始测试前&#x…

如何让家居设备快速通过Matter认证?移远通信为您带来标准回答

2022年10月&#xff0c;Matter协议正式面向全球发布&#xff1b;2023年10月23日&#xff0c;Matter 1.2最新版本正式发布。在Matter发布至今的时日里&#xff0c;众多头部厂商纷纷加速开发新产品&#xff0c;只为更快抢占市场先机&#xff0c;以“先发者”身份入局新赛道&#…

数据库安全定义以及重要性简单讲解

数据库安全定义 数据库安全指的是对数据库进行保护&#xff0c;以确保其数据的机密性、完整性和可用性&#xff0c;并防止非法访问、篡改、破坏、泄露等安全威胁。一般包括访问控制、数据加密、审计和监控、数据备份、漏洞修补、网络安全等方面。 数据库安全的重要性 1、数据…

C++ 学习 之 名字空间 namespace

必须在模块里面 extern 声明 在一个 cpp 文件中&#xff0c; 一个namespace 可以多次定义&#xff0c;最后合并&#xff0c;使用 using namespace A 这种引入方式的话&#xff0c;使用的时候可以用所有 A 中的数据 多个 cpp 文件的话&#xff0c;不能会自动合并相同的 名字空…

HackTheBox - Starting Point -- Tier 0 ---Preignition

文章目录 一 题目二 实验过程 一 题目 Tags Web、Custom Applications、Apache、Reconnaissance、Web Site Structure Discovery、Default Credentials译文&#xff1a;Web、定制应用程序、Apache、侦察、网站结构发现、默认凭证Connect To attack the target machine, you …

论文-分布式-分布式计算|容错-分布式控制下的自稳定系统

参考文献Self-stabilizing systems in spite of distributed control可以把松散耦合的 循环序列过程 间的同步任务&#xff0c;看成是要保持一个这样的不变性&#xff1a;“系统要处于一种合法状态”因此每个进程在运行每一个可能会改变不变性的步骤之前都要先检查一下是可以执…