考研数据结构线性表之顺序表

news/2025/1/20 17:14:43/

第二章线性表

1.1线性表的定义和基本操作

        定义:线性表时具有\textcolor{blue}{相同数据类型}的n(n≥0)个数据元素的\textcolor{blue}{有限序列},其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为:L=(a_1,a_2,...,a_i,a_{i+1},...,a_n).

        涉及概念

        1.a_i是线性表的“第i个”元素线性表中的位序。(位序是从一开始,但是数组是从0开始的)

        2.a_1是表头元素,a_n是表尾元素。

        3.除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继。

线性表的基本操作:

   当需要将参数修改结构带回来时。加上“&”。

        InitList(&L):初始化表。构造一个新的空线性表L,分配内存空间。

        DestroyList(&L):销毁操作。

        ListInsert(&L,i,e):插入操作。在第i个位置插入元素e。

        ListDetele(&L,i,&e):删除操作。在第i个位置删除元素e。

        LocateElem(L,e):按值查找元素。

        GetElem(L,i):按位查找元素。

   其他操作:

        Length(L):求表长。返回线性表长度。

        PrintList(L):输出操作。

        Empty(L):判空操作。如果L为空表,返回true。

注:为什么要使用这些封装函数?

        1.定义的数据结构方便别人使用;

        2.避免重复工作,降低出错风险。

1.2线性表的顺序存储

            顺序表定义:用顺序存储的方式实现线性表的顺序存储。

顺序表操作的实现:

        顺序表的实现——静态分配

                //静态的大小一旦生成就不可变了

#define MaxSize = 10
typedef struct{int data[MaxSize];  //用静态的数组存放数据元素  int length;         //顺序表当前的长度
}SqList;                //顺序表的类型定义

        初始化函数

void InitList(SqList &L){for(int i=0;i<MaxSize;i++)L.data[i]=0;L.length=0;
}

        插入函数

bool ListInsert(SqList &L,int i,int e){if(i<1||i>L.length+1)       return false;if(L.length>=MaxSize)       return false;for(int j=L.length;j>=i;J--)    //第i个元素及之后的元素后移L.data[j]=L.data[j-1];L.data[i]=e;            //给第i个赋值L.length++;             //长度+1return true;
}

        这个函数的的最好情况是0,最坏情况是n,因此平均时间复杂度为\frac{n}{2}

        删除函数

bool ListDelete(SqList &L,int i,int &e){    //这里的e是用来存储删除的那个元素的值的if(i<1||i>L.length)     return false;e=L.data[i-1];          //位序跟数组不一样for(int j=i;j<L.length;j++)     //注意这里是<,不是≤.L.data[j-1]=L.data[j];L.length--;return true;
}

        这个函数的的最好情况是0,最坏情况是n-1,因此平均时间复杂度为\frac{n-1}{2}

        按位序查找元素函数

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

        按值查找元素函数

int Locate(SqList L,int e){for(int i=0;i<L.length-1;i++)if(L.data[i]==e)return i+1;return 0;
}
        顺序表的实现——动态分配
#define InitSize = 10
typedef struct{ElemType *data;     //指示动态分配数组的指针int MaxSize;        //顺序表的最大容量int length;         //顺序表当前的长度
}SqList;                //顺序表的类型定

这里面就涉及了怎么申请空间,并让data指过去,在C/C++中动态申请和释放内存空间的函数

C   ——  malloc、free函数L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize) //后面的*是乘号的意思
C++ ——  new、delete关键字

        初始化函数

void InitList(SqList &L){L.data=(int *)malloc(InitSize*sizeof(int));L.length=0;L.MaxSize=InitSize;
}​
//增加动态数组长度的函数
void IncreaseSize(SqList &L,int len){int* p=L.data;L.data=(int *)malloc((L.Maxsize+len))*sizeof(int)); //data指向新产生的空间for(int i=0;i<L.length;i++){L.data[i]=p[i];             //将数据复制到新区域}L.MaxSize=L.MaxSize+len;free(p);
}

顺序表的特点:

        1.随机访问,可以在O(1)时间内找到第i个元素。

        2.存储密度高,每个节点只存储数据元素。

        3.拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)

        4.插入、删除操作不方便,需要移动大量的数据

本章节有个关于结构类型的知识点:

        即在C语言中两个结构类型的变量是不是直接用“==”来比较是否相等的,需要另外定义一个函数逐项比较结构体中每一个元素。在C++中可以定义一个重载来实现。

总结:

        本文章是对数据结构中顺序表的学习总结,包括源代码,学习笔记是根据王道基础课。


http://www.ppmy.cn/news/1564709.html

相关文章

CC工具箱使用指南:【Excel点集转面要素(批量)】

一、简介 群友定制工具。 此工具的功能是将一系列Excel文件转成面要素。 假设文件夹下有许多Excel文件&#xff1a; Excel文件长这样&#xff1a; 工具取x,y列&#xff0c;转成点集并生成面要素&#xff0c;同时将Excel文件名作为一个字段保存下来。 二、工具参数介绍 点击…

网络安全(渗透)

目录 名词解释 2、相互关系 3. 安全影响 名词解释 1、poc、exp、payload与shellcode POC&#xff08;Proof of Concept&#xff09;&#xff1a; 是一种概念验证代码或演示程序&#xff0c;用于证明漏洞的存在。 主要目的是通过简单的代码或操作向安全研究人员、开发人员…

ESP32学习笔记_FreeRTOS(7)——Stream and Message

摘要(From AI): 本文介绍了 FreeRTOS 中的流缓冲区&#xff08;Stream Buffer&#xff09;和消息缓冲区&#xff08;Message Buffer&#xff09;的使用&#xff0c;重点讲解了它们在任务间数据传输中的应用。流缓冲区适用于实时数据流的传输&#xff0c;支持单一写入者和读取者…

深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)

前言 LSTM是RNN模型的升级版&#xff0c;神经网络模型较为复杂&#xff0c;这里是学习笔记的记录&#xff1b;LSTM比较复杂&#xff0c;可以先看&#xff1a; 深度学习基础–一文搞懂RNN 深度学习基础–GRU学习笔记(李沐《动手学习深度学习》) RNN&#xff1a;RNN讲解参考&am…

iOS - Objective-C 底层实现中的哈希表

1. 关联对象存储&#xff08;AssociationsHashMap&#xff09; // 关联对象的哈希表实现 typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap; typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMa…

【React学习笔记】第三章:React应用

1.使用create-react-app创建 react 应用 1.1 react 脚手架 react提供了一个用于创建 react 项目的脚手架&#xff1a;create-react-app 项目的整体技术架构为&#xff1a;react webpack es6 eslint 1.2 创建项目并启动 打开CMD 第一步&#xff1a; 全局安装react脚手架 …

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中&#xff0c;当应用/系统服务的客户端和服务端进行IPC&#xff08;Inter-Process Communication&#xff09;跨线程通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony ID…

基于PHP的校园新闻发布管理

摘要 近年来&#xff0c;随着互联网技术的迅速发展&#xff0c;人们获取新闻的渠道也变得越来越多样化&#xff0c;已经不再拘束于传统的报纸、期刊、杂志等纸质化的方式&#xff0c;而是通过网络满足了人们获得第一手新闻的愿望&#xff0c;这样更加有助于实现新闻的规范化管…