数据结构--线性表(顺序结构)

news2024/11/28 20:54:02

1.线性表的定义和基本操作

1.1线性表以及基本逻辑

1.1.1线性表

(1)n(>=0)个数据元素的有限序列,记作(a1,a2,...an),其中ai是线性表中的数据元素,n是表的长度。

(2)ai是线性表中“第i个”元素在线性表中的位序。

注意:数组下标从0(a[0])开始,位序从1开始.

 1.1.2逻辑特征(n>0)

存在唯一的一个被称为“第一个”的数据元素。

存在唯一的一个被称为“最后一个”的数据元素。

除了第一个元素以外,其他元素均只有一个直接前驱。

除了最后一个元素外,其他元素均只有一个直接后继。

1.2线性表的基本操作

InitList(&L)              //创建一个新的线性表L

ListEmpty(L)           //判断L是否为空

ListLength(L)          //求L的长度

GetElem(L,i,&e)     //取i位置数据元素的值

ClearList(&L)          //将L置为空表

ListInsert(&L,i,e)     //在i位置插入值为e的数据元素

ListDelete(&L,i,&e) //删除i位置的元素e

1.ListInsert(&L,i,e)  ,传值

2.ListDelete(&L,i,&e),传引用

3.ListDelete(&L,i,*e),传指针

1.形参改变->不会影响实参

2.3.形参改变->会影响实参(传引用,传指针)

 下面用一张图来介绍形参和实参的区别:(by 通义千问)

传引用(&)适用场景:

1.需要函数修改原始数据。

2.对于大型数组或对象,为了节省内存开销和提升运算效率,使用引用传递。

一句话:对参数的修改结果要“带回来”。 

2.线性表的顺序表示

2.1线性表和顺序表的定义

(1)线性表:线性表是具有相同数据类型的n(n>=0)个数据元素的有限序列。

(2)顺序表:用顺序的方式实现线性表的顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

2.2静态分配和动态分配

2.2.1静态分配

#define MAX 10
int arr[MAX];
int n;         //数据元素个数小于n个

结构体进行封装:

#define MAX 100
typedef struct
{
    ElemType elem[MAX];
    int n;
}Sqlist;

2.2.2动态存储

(1)动态申请和释放内存空间

(2)C语言--malloc,free函数

L.data=(ElemType *)malloc(sizeof(ElemType)*InitSize)
//malloc函数返回一个指针,需要用“(ElemType *)”强制类型转化为自己定义的数据元素类型指针

2.2.3顺序表基本操作实现

1.初始化顺序表InitList_Sq(&L)

操作结果:构造一个空的顺序表L.

Status InitList_Sq(SqList&L)       // 定义一个函数名为 InitList_Sq 的函数,参数是对 SqList 类型的引用 L,返回类型为 Status(这里 Status 可能是一个自定义的表示状态的类型)
{
    L.elem=(ElemType*)malloc(initial_size*sizeof(ElemType));  // 为 L 的 elem 属性分配一块内存空间,大小为 initial_size 个 ElemType 类型元素所需的空间,并将其地址转换为 ElemType*类型赋给 L.elem
    if(!L.elem)                    // 如果分配内存失败(L.elem 为假,即内存分配不成功得到的是 null 指针等情况)
        exit(OVERFLOW);            // 退出程序并表示存储空间分配失败(OVERFLOW 可能是一个表示溢出或错误的常量)
    L.length=0;                    // 将顺序表 L 的当前长度设置为 0
    L.listsize=initial_size;       // 将顺序表 L 的初始容量设置为 initial_size
    return 0;                      // 返回一个状态值(这里可能表示成功初始化)
}

下面是对顺序表中长度和容量的解释: 

在顺序表(Sequential List)中:

 

一、长度(length

 

指的是顺序表中当前实际存储的元素个数。

 

例如,如果有一个顺序表存储了 5 个整数,那么这个顺序表的长度就是 5。随着向顺序表中添加或删除元素,长度会相应地发生变化。

 

二、容量(listsize

 

指的是顺序表预先分配的能够存储元素的最大空间大小。

 

例如,一开始创建顺序表时可能分配了一块可以存储 10 个整数的连续内存空间,那么此时这个顺序表的容量就是 10。当顺序表中的元素个数达到容量时,如果要继续添加元素,通常需要进行扩容操作(重新分配更大的连续内存空间)。而如果顺序表中的元素个数远小于容量,那么就存在一部分未被使用的内存空间。

2.销毁顺序表DestroyList_Sq(&L):

释放L所占用的内存空间

void DestroyList_Sq(SqList &L)
{
    free(L.elem); // 释放顺序表 L 的存储数据的内存空间。free 函数用于释放由 malloc、calloc 或 realloc 等函数分配的动态内存。
    L.elem = NULL; // 将 L 的 elem 指针设置为 NULL,避免出现悬空指针。
    L.length = 0; // 将顺序表的长度设置为 0,表示表中没有元素。
    L.listsize = 0; // 将顺序表的容量设置为 0。
}

3.判定是否为空表 ListEmpty_Sq(L):

若L为空表,返回1,否则返回0;

int ListEmpty_Sq(SqList L)
{
    if (L.length==0)
        return 1;
    else 
        return 0;

4.输出顺序表 DispList_Sq(L):

操作结果:当L不为空时,顺序显示L中各个元素的值。

Status DispList_Sq(SqList L)
{
    if (ListEmpty_Sq(L))
        return ERROR;
    // 如果顺序表为空(通过调用 ListEmpty_Sq 函数判断),则返回 ERROR(可能是一个表示错误的状态码)。

    for(i=0;i<=L-1;i++){
        print(L.elem[i]);
    }
    // 如果顺序表不为空,遍历顺序表,从第一个元素(下标为 0)开始,直到最后一个元素(下标为 L-1),逐个打印顺序表中的元素。

    return OK;
    // 遍历完成后,返回 OK(可能是一个表示成功的状态码)。
}

5.插入数据元素  ListInsert_Sq(&L,i,e):

操作结果:在顺序表L的第i个位置前插入新元素e. 

ListInsert_Sq(SqList &L, int i, ElemType e) 
{
    if (i < 1 || i > L.length + 1) {
        return ERROR;
    }
    // 判断插入位置 i 是否合法,i 应该在 1 到(当前顺序表长度 + 1)之间,否则返回错误状态码 ERROR。

    if (L.length >= L.listsize) {
        newbase = (ElemType*)malloc(L.elem,(L.listsize + ElemNumber)*sizeof(ElemType));
        L.elem = newbase;
        L.listsize += ElemNumber;
    }
    // 如果当前顺序表中已存储的元素个数(L.length)等于或超过了顺序表的容量(L.listsize),则进行扩容操作。
    // 分配一块新的内存空间,大小为原来的容量加上 ElemNumber 个 ElemType 类型元素所需的空间,然后将新分配的内存地址赋给 L.elem,并更新顺序表的容量 L.listsize。

    for (j = L.length; j >= i; j--) {
        L.elem[j] = L.elem[j - 1];
    }
    // 将插入位置 i 及之后的元素向后移动一位。

    L.elem[i - 1] = e;
    // 在插入位置 i 处放入新元素 e。

    ++L.length;
    // 顺序表长度加一。

    return 1;
    // 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:新元素插到表尾,不需要移动元素i=n+1,循环0次,T(n)=O(1);

-最坏情况:新元素插到表头,需要将原有的n个元素全部向后移动i=1,循环n次,T(n)=O(n);

-平均情况:,新元素插入到任意一个位置概率相同,需要的时间是n/2,考虑到时间复杂度量级,T(n)=O(n).  

6.删除数据元素 ListDelete_Sq(&L,i,&e):

操作结果:删除顺序表L中的第i个元素,用引用变量e返回删除的元素。

ListInsert_Sq(SqList &L, int i, ElemType &e) 
{
    if (i < 1 || i > L.length) {
        return ERROR;
    }
    // 判断插入位置 i 是否合法。i 应该在 1 到顺序表的当前长度之间,如果不合法则返回错误状态码 ERROR。

    e = L.elem[i - 1];
    // 将顺序表中位置 i 处的元素赋值给参数 e。

    for (j = i; j < L.length; j++) {
        L.elem[j - 1] = L.elem[j];
    }
    // 从位置 i 开始,将后面的元素依次向前移动一位。

    --L.length;
    // 顺序表的长度减一,表示删除了一个元素。

    return 1;
    // 返回一个表示成功的状态码(这里是 1)。
}

时间复杂度:

-最好情况:T(n)=O(1);

-最坏情况:T(n)=O(n);

-平均情况:T(n)=O(n).  

 7.按位查找操作 GetElem(L,i):

操作结果:获取表L中的第i个位置元素的值。

ElemType GetElem(SeqList L,int i)
{
    return L.data[i-1];
}

 时间复杂度:O(1)

 8.按值查找操作 LocateElem(L,e):

操作结果:在表L中查找具有给定关键字值的元素(第一个)。

//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SeqList L,ElemType e)
{
    for(int i=0;i<=L.length-1;i++){
        if(L.data[i]==e){
            return i+1;
        }
    }
    return 0;
}

时间复杂度:

-最好情况:目标元素子啊表头,循环1次,T(n)=O(1);

-最坏情况:目标元素在表尾,循环n次,T(n)=O(n);

-平均情况:目标元素出现在任何一个位置的概率相同,T(n)=O(n).  

 下面是链表,敬请期待...

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

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

相关文章

【RabbitMQ】RabbitMQ学习

1. 发送流程 生产者 - connection - channel - 交换机 - 对列- channel - connection - 消费者 2. 工作模式 2.1. 简单模式&#xff08;点对点&#xff09; 一个消费者一个生产者&#xff0c;直接进行通信。 2.2. 工作对列模式 多个消费者共同消费消息对列中的消息。同一条…

10其他内容补充

如何生成随机数原理详细分析 文章目录 如何生成随机数原理详细分析原理如果使用相同的随机数种子,得到的随机数序列会是相同的吗示例为什么需要随机数种子 动态内存管理前言malloc函数calloc函数realloc函数free函数 - 避免内存泄漏常见的动态内存错误 原理 说到如何生成一个随…

实现TCP Connect的断线重连机制:策略与实践

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 断线重连机制&#xff0c;它成为确保应用在网络不稳定情况下仍能持续提供服务的关键技术之一。本文旨在深入探讨TCP&#xff08;传输控制协…

浅聊前后端分离开发和前后端不分离开发模式

1.先聊聊Web开发的开发框架Spring MVC 首先要知道&#xff0c;Spring MVC是Web开发领域的一个知名框架&#xff0c;可以开发基于请求-响应模式的Web应用。而Web开发的本质是遵循HTTP&#xff08;Hyper Text Transfer Protocol: 超文本传输协议&#xff09;协议【发请求&#xf…

仿RabbitMQ实现消息队列客户端

文章目录 客⼾端模块实现订阅者模块信道管理模块异步⼯作线程实现连接管理模块生产者客户端消费者客户端 客⼾端模块实现 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&#xff0c;弱化了Client客⼾端的概念&#xff0c;也就是说在RabbitMQ中并…

V2M2引擎源码BlueCodePXL源码完整版

V2M2引擎源码BlueCodePXL源码完整版 链接: https://pan.baidu.com/s/1ifcTHAxcbD2CyY7gDWRVzQ?pwdmt4g 提取码: mt4g 参考资料&#xff1a;BlueCodePXL源码完整版_1234FCOM专注游戏工具及源码例子分享

图解大模型计算加速系列:vLLM源码解析3,块管理器(BlockManager)上篇

vllm块管理器又分成朴素块管理器&#xff08;UncachedBlockAllocator&#xff09;和prefix caching型块管理器&#xff08;CachedBlockAllocator&#xff09;。本篇我们先讲比较简单的前者&#xff0c;下篇我们来细看更有趣也是更难的后者。 【全文目录如下】 【1】前情提要…

阿里巴巴开源的FastJson 1反序列化漏洞复现攻击保姆级教程

免责申明 本文仅是用于学习检测自己搭建的靶场环境有关FastJson1反序列化漏洞的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在…

Linux高级编程_29_信号

文章目录 进程间通讯 - 信号信号完整的信号周期信号的编号信号的产生发送信号1 kill 函数(他杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 2 raise函数(自杀)作用&#xff1a;示例&#xff1a; 3 abort函数(自杀)作用&#xff1a;语法&#xff1a;示例&#xff1a; 4 …

macos安装git并连接gitCode远程仓库

文章目录 资料地址下载和安装初始化配置本地全局配置&#xff0c;SSH公私密钥生成远程SSH key配置 新建代码仓库&#xff0c;并关联到本地 资料地址 git官网地址gitCode地址 下载和安装 打开git官网地址&#xff0c;直接下载。【不建议使用brew&#xff0c;因为本人实践&…

【Qt】控件概述(2)—— 按钮类控件

控件概述&#xff08;2&#xff09; 1. PushButton2. RadioButton——单选按钮2.1 使用2.2 区分信号 clicked&#xff0c;clicked(bool)&#xff0c;pressed&#xff0c;released&#xff0c;toggled(bool)2.3 QButtonGroup分组 3. CheckBox——复选按钮 1. PushButton QPushB…

B树系列解析

我最近开了几个专栏&#xff0c;诚信互三&#xff01; > |||《算法专栏》&#xff1a;&#xff1a;刷题教程来自网站《代码随想录》。||| > |||《C专栏》&#xff1a;&#xff1a;记录我学习C的经历&#xff0c;看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

etcd 快速入门

简介 随着go与kubernetes的大热&#xff0c;etcd作为一个基于go编写的分布式键值存储&#xff0c;逐渐为开发者所熟知&#xff0c;尤其是其还作为kubernetes的数据存储仓库&#xff0c;更是引起广泛专注。 本文我们就来聊一聊etcd到底是什么及其工作机制。 首先&#xff0c;…

查找回收站里隐藏的文件

在Windows里&#xff0c;每个磁盘分区都有一个隐藏的回收站Recycle&#xff0c; 回收站里保存着用户删除的文件、图片、视频等数据&#xff0c;比如&#xff0c;C盘的回收站为C:\RECYCLE.BIN\&#xff0c;D盘的的回收站为D:\RECYCLE.BIN\&#xff0c;E盘的的回收站为E:\RECYCLE…

【解决方案】JVM调优:给定资源条件下减少Full GC频率

1 缘起 在一次其他团队技术分享时,有幸进行了旁听, 谈到一个应用场景,服务端在给定的资源下,频繁Full GC, 降低了服务请求处理能力以及任务处理能力,频繁Full GC,导致服务处理能力下降, 服务在Full GC期间无法处理用户请求以及其他任务,服务不稳定,可以理解为服务在…

【C++算法】9.双指针_四数之和

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 18.四数之和 题目描述&#xff1a; 解法 解法一&#xff1a;排序暴力枚举利用set去重 解法二&#xff1a;排序双指针 从左往右依次固定一个数a在a后面的区间里&#x…

坐标系变换总结

二维情况下的转换 1 缩放变换 形象理解就是图像在x方向和y方向上放大或者缩小。 代数形式&#xff1a; { x ′ k x x y ′ k y y \begin{cases} x k_x x \\ y k_y y \end{cases} {x′kx​xy′ky​y​ 矩阵形式&#xff1a; ( x ′ y ′ ) ( k x 0 0 k y ) ( x y ) \be…

【C语言】数据在内存中的存储(万字解析)

文章目录 一、大小端字节序和字节序判断1.案例引入2.什么是大小端字节序3.大小端字节序判断 二、整数在内存中的存储以及相关练习1.整型在内存中的存储2.练习练习1&#xff1a;练习2练习3练习4练习5&#xff1a;练习6 三、浮点数在内存中的存储1.案例引入2.浮点数在内存中的存储…

uniapp+Android面向网络学习的时间管理工具软件 微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

KVM虚拟化技术介绍

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 虚拟化技术是云计算的基础&#xff0c;什么是虚拟化&#xff1f;虚拟化技术的本质是什么&#xff1f;主流的虚拟化技术有哪些&#xff1f;本章将为您揭晓 一.虚拟化概述 虚拟化是一种将计…