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

一、顺序表的定义

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,一经查实,立即删除!

相关文章

Ubuntu设置允许root用户登录

1、激活root用户 sudo passwd root //设置root密码 su root //接着使用root登录 2、设置允许root通过ssh登录 nano /etc/ssh/sshd_config 将 PermitRootLogin 改为 yes 3、重启ssh service ssh restart 到这里就好了

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

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

德语中第二虚拟式在主动态的形式,柯桥哪里可以学德语

德语中第二虚拟式在主动态的形式 1. 对于大多数的动词&#xff0c;一般使用这样的一般现在时时态&#xff1a; wrde 动词原形 例句&#xff1a;Wenn es nicht so viel kosten wrde, wrde ich mir ein Haus am Meer kaufen. 如果不花这么多钱&#xff0c;我会在海边买一栋房…

8. Cesium中的camera

1. 介绍 camera是viewer.scene中的属性&#xff0c;用来控制当前的可见域。viewer.camera 是快捷写法&#xff0c;访问的是 viewer.scene.camera&#xff0c;所以调用时这两种写法都行。介绍常用的view.carmera方法。 &#xff08;1&#xff09;. setView Camera根据视图位置…

React 在非组件环境切换路由

我的react-router-dom版本是6.16.0。之前在react中是这样配置路由的 App.jsx import ReactDOM from react-dom/client; import { HashRouter, Route, Routes } from react-router-dom;const root ReactDOM.createRoot(document.getElementById("app")); root.rend…

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等等。本文主…

vite工具官方地址 +前端工具插件

该项目与 Vite 一起提供服务和捆绑。推荐的 IDE 设置是 ** VSCode Volar。 **如果您需要测试组件和网页&#xff0c;请查看赛普拉斯和赛普拉斯组件测试。 有关更多说明&#xff0c;请参见。README.md vite官方地址

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

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.基…

Redis -- 基础知识1

1.介绍 1.初识Redis Redis&#xff1a;The open source, in-memory data store used by millions of developers as a database, cache, streaming engine, and message broker. in-memory data&#xff1a;在内存中存储&#xff0c;Redis是在分布式系统中存储起作用的 解释&am…

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

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

主线程和子线程的区别

在多线程编程中&#xff0c;我们通常会涉及到主线程&#xff08;也称为父线程&#xff09;和子线程&#xff08;也称为工作线程&#xff09;。 1. 主线程&#xff1a;主线程是程序的起点&#xff0c;它负责创建和管理其他线程。主线程通常执行程序的初始化操作&#xff0c;包括…

Kotlin中的嵌套类、内部类、枚举类、密封类、数据类、单例类、伴生对象

在Kotlin中&#xff0c;类可以分为以下几种类型&#xff0c;并使用样例代码进行说明&#xff1a; 嵌套类&#xff08;Nested Class&#xff09;&#xff1a;嵌套类是指可以嵌套在其他类中的类。嵌套类不能直接访问外部类的成员。例如&#xff0c;在下面的代码中&#xff0c;&q…

正点原子嵌入式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…

LeetCode 面试题 16.03. 交点

文章目录 一、题目二、C# 题解 一、题目 给定两条线段&#xff08;表示为起点 start {X1, Y1} 和终点 end {X2, Y2}&#xff09;&#xff0c;如果它们有交点&#xff0c;请计算其交点&#xff0c;没有交点则返回空值。 要求浮点型误差不超过 10^-6。若有多个交点&#xff08;…

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

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