数据结构——考研笔记(二)线性表的定义和线性表之顺序表
文章目录
- 二、线性表
- 2.1 定义、基本操作
- 2.1.1 知识总览
- 2.1.2 线性表的定义
- 2.1.3 线性表的基本操作
- 2.1.4 知识回顾与重要考点
- 2.2 顺序表
- 2.2.1 知识总览
- 2.2.2 顺序表的定义
- 2.2.3 顺序表的实现——静态分配
- 2.2.4 顺序表的实现——动态分配
- 2.2.5 知识回顾与重要考点
- 2.2.6 顺序表的插入和删除
- 2.2.6.1 插入
- 2.2.6.2 插入操作的时间复杂度
- 2.2.6.3 删除
- 2.2.6.4 删除操作的时间复杂度
- 2.2.6.5 知识回顾与重要考点
- 2.2.7 顺序表的查找
- 2.2.7.1 按位查找
- 2.2.7.2 按值查找
- 2.2.7.3 知识回顾与重要考点
二、线性表
2.1 定义、基本操作
2.1.1 知识总览

- 线性表:
- 定义(逻辑结构)
- 基本操作(运算)
2.1.2 线性表的定义
线性表:线性表是具有相同数据类型的n(n$>=$0)个数据元素的有限序列,其中n为表长,当n=0时线性表是一个空表。若用L命名线性表,则其一般表示为

以下是几个概念
- ai是线性表中的“第i个”元素线性表中的位序
- a1是表头元素;an是表尾元素
- 除第一个元素外,每个元素有且仅有一个直接前驱;除最后一个元素外,每个元素有且仅有一个直接后继
2.1.3 线性表的基本操作
- InitList(&L):初始化表。构造一个空的线性表L,分配内存空间。
- DestoryList(&L):销毁操作。销毁线性表,并释放线性表L所占用的内存空间
- ListInsert(&L,i,e):插入操作。在表L中的第i个位置上插入指定元素e
- ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值
- LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。
- GetElem(L,i):按位查找操作。获取表L中第i个位置的元素的值。
其他常用操作
- Length(L):求表长。返回线性表L的长度,即L中数据元素的个数。
- PrintList(L):输出操作。按前后顺序输出线性表L的所有元素值。
- Empty(L):判空操作。若L位空表,则返回true,否则返回false。
Tips:
- 对数据的操作(记忆思路)——创销、增删改查
- C语言函数的定义—— <返回值类型> 函数名(<参数1类型>参数1,<参数2类型>参数2,……)
- 实际开发中,可根据实际需求定义其他的基本操作
- 函数名和参数的形式、命名都可改变(命名要有可读性)
- 什么时候要传入“&”——对参数的修改结果需要“带回来”

为什么要实现对数据结构的基本操作》
- 团队合作编程,你定义的数据结构要让别人能够很方便的使用(封装)
- 将常用的操作/运算封装成函数,避免重复工作,降低出错风险
2.1.4 知识回顾与重要考点

2.2 顺序表
2.2.1 知识总览

2.2.2 顺序表的定义

顺序表:用顺序存储的方式实现线性表顺序存储。把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。
2.2.3 顺序表的实现——静态分配
#define MaxSize 10 //定义最大长度
typeof struct{ElemType data[MaxSize]; //用静态的“数组”存放数据元素int length; //顺序表的当前长度
}SqList; //顺序表的类型定义(静态分配方式)

上述代码中给各个数据元素分配连续的存储空间,大小位MaxSize*sizeof(ElemType)

-
代码实现
#include <stdio.h> #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; //顺序表初始长度为0 }int main() {SqList L; //声明一个顺序表InitList(L);//初始化顺序表//……未完待续,后续操作return 0; }
如果“数组”存满了怎么办?
可以放弃治疗,顺序表的表长刚开始确定后就无法更改(存储空间是静态的)
思考:如果刚开始就声明一个很大的内存空间呢?存在什么问题?
2.2.4 顺序表的实现——动态分配

Key:动态申请和释放内存空间
C —— malloc、free函数
malloc函数返回一个指针,需要强制转型为你定义数据元素类型指针
eg:L.data = (ElemType *)malloc(sizeof(ElemType)*InitSize)
表示要申请的一整片连续的内存空间
C++ —— new、delete关键字

- 代码实现
#include <stdlib.h>
#define InitSize 10 //默认的最大长度typedef struct {int* data; //指示动态分配数组的指针int MaxSize; //顺序表的最大容量int length; //顺序表的当前长度
}SeqList;void InitList(SeqList& L) {//用malloc函数申请一片连续的内存空间L.data = (int*)malloc(InitSize * sizeof(int));L.length = 0;L.MaxSize = InitSize;
}//增加动态数组的长度
void IncreaseSize(SeqList& L, int len) {int* p = L.data;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; //顺序表最大长度增加lenfree(p); //释放原来的内存空间
}int main() {SeqList L; //声明一个顺序表InitList(L); //初始化顺序表//……往顺序表中随便插入几个元素……IncreaseSize(L, 5);return 0;
}
顺序表的特点:
- 随机访问,即可以在O(1)时间内找到第i个元素。(代码实现:data[i-1])
- 存储密度高,每个节点只存储数据元素。
- 拓展容量不方便(即便采用动态分配的方式实现。拓展长度的时间复杂度也比较高)
- 插入、删除操作不方便,需要移动大量元素。
2.2.5 知识回顾与重要考点

2.2.6 顺序表的插入和删除

2.2.6.1 插入

ListInsert(&L,i,e):插入操作。在表L中的第i个位置插入指定元素e。
- 代码实现
#include <stdio.h>
#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; //顺序表初始长度为0
}
//插入
bool ListInsert(SqList& L, int i, int e) {if (i<1 || i>L.length + 1) //判断i的范围是否有效return false;if (L.length >= MaxSize) //当前存储空间已满,不能插入return false;for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1]; //将第i个元素及之后的元素后移}L.data[i - 1] = e; //在位置i出放入eL.length++; //长度加1return true;
}int main() {SqList L; //声明一个顺序表InitList(L);//初始化顺序表//……此处省略一些代码,插入几个元素ListInsert(L, 3, 3);printf("data[2]=%d", L.data[2]);return 0;
}
2.2.6.2 插入操作的时间复杂度

2.2.6.3 删除
ListDelete(&L,i,&e):删除操作。删除表L中第i个位置的元素,并用e返回删除元素的值。

- 代码实现
#include <stdio.h>
#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; //顺序表初始长度为0
}
//插入
bool ListInsert(SqList& L, int i, int e) {if (i<1 || i>L.length + 1) //判断i的范围是否有效return false;if (L.length >= MaxSize) //当前存储空间已满,不能插入return false;for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1]; //将第i个元素及之后的元素后移}L.data[i - 1] = e; //在位置i出放入eL.length++; //长度加1return true;
}
//删除
bool ListDelete(SqList& L, int i, int& e) {if (i<1 || i>L.length) //判断i的范围是否有效return false;e = L.data[i - 1]; //将被删除的元素赋值给efor (int j = i; j < L.length; j++) {L.data[j - 1] = L.data[j]; //将第i个位置后的元素前移}L.length--; //线性表长度减1return true;
}
int main() {SqList L; //声明一个顺序表InitList(L);//初始化顺序表//……此处省略一些代码,插入几个元素ListInsert(L, 3, 3);int e = -1; //用变量e把删除的元素“带回来”if (ListDelete(L, 3, e))printf("已删除第3个元素,删除元素为=%d\n", e);elseprintf("位序i不合法,删除失败\n");return 0;
}
2.2.6.4 删除操作的时间复杂度

2.2.6.5 知识回顾与重要考点

2.2.7 顺序表的查找

2.2.7.1 按位查找
- 静态分配实现按位查找

- 动态分配实现按位查找

- 按位查找的时间复杂度

2.2.7.2 按值查找
LocateElem(L,e):按值查找操作。在表L中查找具有给定关键字值的元素。

注意:数组下标为i的元素值等于e,返回其位序i+1
- 代码实现
#include <stdio.h>
#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; //顺序表初始长度为0
}
//插入
bool ListInsert(SqList& L, int i, int e) {if (i<1 || i>L.length + 1) //判断i的范围是否有效return false;if (L.length >= MaxSize) //当前存储空间已满,不能插入return false;for (int j = L.length; j >= i; j--) {L.data[j] = L.data[j - 1]; //将第i个元素及之后的元素后移}L.data[i - 1] = e; //在位置i出放入eL.length++; //长度加1return true;
}
//删除
bool ListDelete(SqList& L, int i, int& e) {if (i<1 || i>L.length) //判断i的范围是否有效return false;e = L.data[i - 1]; //将被删除的元素赋值给efor (int j = i; j < L.length; j++) {L.data[j - 1] = L.data[j]; //将第i个位置后的元素前移}L.length--; //线性表长度减1return true;
}
//在顺序表L中查找第一个元素值等于e的元素,并返回其位序
int LocateElem(SqList L, int e) {for (int i = 0; i < L.length; i++) {if (L.data[i] == e)return i + 1;}return 0;
}
int main() {SqList L; //声明一个顺序表InitList(L);//初始化顺序表//……此处省略一些代码,插入几个元素ListInsert(L, 3, 3);int i = LocateElem(L, 3);printf("位序为%d", i);return 0;
}
- 按值查找的时间复杂度

2.2.7.3 知识回顾与重要考点

相关文章:
数据结构——考研笔记(二)线性表的定义和线性表之顺序表
文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…...
quota使用
一、检查系统是否支持 grep CONFIG_QUOTA /boot/config* CONFIG_QUOTAy CONFIG_QUOTA_NETLINK_INTERFACEy # CONFIG_QUOTA_DEBUG is not set CONFIG_QUOTA_TREEy CONFIG_QUOTACTLy CONFIG_QUOTACTL_COMPATy二、安装 yum install -y quota三、配置 3.1 创建磁盘 格式一定要 …...
解决fidder小黑怪倒出JMeter文件缺失域名、请求头
解决fidder小黑怪倒出JMeter文件缺失域名、请求头 1、目录结构: 2、代码 coding:utf-8 Software:PyCharm Time:2024/7/10 14:02 Author:Dr.zxyimport zipfile import os import xml.etree.ElementTree as ET import re#定义信息头 headers_to_extract [Host, Conn…...
智慧城市的神经网络:Transformer模型在智能城市构建中的应用
智慧城市的神经网络:Transformer模型在智能城市构建中的应用 随着城市化的快速发展,智能城市的概念应运而生,旨在通过先进的信息技术提升城市管理效率和居民生活质量。Transformer模型,作为人工智能领域的一颗新星,其…...
产品经理-研发流程-敏捷开发-迭代-需求评审及产品规划(15)
敏捷开发是以用户的需求进化为核心,采用迭代、循序渐进的方法进行软件开发。 通俗来说,敏捷开发是一个软件开发流程,是一个采用了迭代方法的开发流程 简单来说,迭代就是把一个大产品拆分出一些最小的实现单位。完成不同的迭代就最…...
Ansible 安装及使用说明
方案1. 直接下载 源码包到本地后安装 ansible 下载地址:https://releases.ansible.com/ansible/ ansible社区: https://github.com/ansible/ansible 下载地址:GitHub - ansible/ansible at v2.9.0 方案2. 以腾讯的yum源说明:腾讯云文档…...
MyBatisPlus实现增删改查
文章目录 MyBatisPlus实现增删改查基本操作分页查询配置分页插件 MyBatisPlus实现增删改查 实体类GkUser package com.geekmice.springbootselfexercise.entity;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField;…...
【Rust】——不安全Rust
💻博主现有专栏: C51单片机(STC89C516),c语言,c,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux…...
使机器人在执行任务时更加稳定
为了使机器人在执行任务时更加稳定,调整参数时需要考虑多个因素,如步态、速度、角度等。这些参数的调整需要基于实际环境、任务需求和机器人自身的物理特性。以下是一些具体的调整建议: 1. 调整步态和步高 gait_type3; step_height0.03;步态…...
FFmpeg学习(五)-- libswresample使用说明及函数介绍
libswresample Audio合成和重采样 libswresample库用来进行audio数据的合成和重采样操作。调用流程: 调用 swr_alloc 创建SwrContext结构体。设置SwrContext参数,有两种方法: 调用av_opt_set_xx函数逐项设置参数;swr_alloc_set_…...
车载视频监控管理方案:无人驾驶出租车安全出行的保障
近日,无人驾驶出租车“萝卜快跑”在武汉开放载人测试成为热门话题。随着科技的飞速发展,无人驾驶技术已逐渐从概念走向现实,特别是在出租车行业中,无人驾驶出租车的推出将为公众提供更为安全、便捷、高效的出行服务。 视频监控技…...
05STM32EXIT外部中断中断系统
STM32EXIT外部中断&中断系统 中断系统中断触发条件:中断处理流程和用途: STM32中断NVIC嵌套中断向量控制器基本结构NVIC基本结构NVIC优先级分组EXTI简介EXTI基本结构AFIO复用IO口EXTI内部框图旋转编码器简介硬件电路外设手册里的介绍NVIC中断使能寄存…...
MetaGPT和LangGraph对比
MetaGPT和LangGraph是两个不同的AI Agent框架,各有其特点和优势:MetaGPT: MetaGPT是一个多Agent协作框架,模拟软件公司的运作方式。它包含多个角色如产品经理、架构师、项目经理和工程师,每个角色都有特定的职责。MetaGPT采用对话模式&#…...
基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)
基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合,是一种必然的发展趋势。以互联网为基础,以服务于广大用户为目的,发展整体优势,扩…...
关于 RK3588刷镜像升级镜像”没有发现设备“ 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140287339 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
docker 上传镜像到hub仓库
要将 Docker 镜像上传到 Docker Hub,你需要按照以下步骤操作: 登录 Docker Hub 首先,你需要登录到 Docker Hub。打开终端并运行以下命令:docker login系统会提示你输入 Docker Hub 的用户名和密码。 如果密码忘记可以token登录&a…...
查询(q_proj)、键(k_proj)和值(v_proj)投影具体含义
查询(q_proj)、键(k_proj)和值(v_proj)投影,这些投影是自注意力机制的核心组件,特别是在Transformer架构中。 让我们通过一个简化的例子来说明: import numpy as np# 假设输入维度是4,注意力头数是2 input_dim 4 num_heads 2 …...
超详细版阿里云控制台环境配置+数据库配置
目录 一、登录阿里云控制台二、xshell建立远程连接1.安装xshell2.查看公网IP3.新建会话重置密码 三、搭建环境1.安装宝塔面板2.打开宝塔面板 四、安装配置MySQL1.安装2.放行端口号3.新建数据库4.测试连接数据库 一、登录阿里云控制台 登录阿里云控制台,找到实例&am…...
Linux:Linux网络总结(附下载链接)
文章目录 下载链接网络问题综合问题访问一个网页的全过程?WebSocket HTTPHTTP基本概念GET与POSTHTTP特性HTTP缓存技术HTTP的演变HTTP1.1 优化 HTTPSHTTP与HTTPS有哪些区别?HTTPS解决了HTTP的哪些问题?HTTPS如何解决的?HTTPS是如何…...
Cxx Primer-CP-2
开篇第一句话足见作者的高屋建瓴:类型决定程序中数据和操作的意义。随后列举了简单语句i i j;的意义取决于i和j的类型。若它们都是整形,则为通常的算术意义。若它们都为字符串型,则为进行拼接操作。若为用户自定义的class类型,则…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
