线性表(从数据结构的三要素出发)

文章目录

  • 逻辑结构
  • 存储结构
    • 顺序存储
    • 链式存储
      • 单链表
      • 双链表
      • 循环单链表
      • 循环双链表
      • 静态链表
  • 数据的操作
    • 顺序结构
    • 链式结构
      • 单链表
      • 双链表

逻辑结构

线性表是具有相同数据类型的 n ( n ≥ 0 ) n(n≥0) n(n0)个数据元素的有限序列,其中 n n n为表长,当 n = 0 n=0 n=0时线性表是一个空表。若用 L L L命名线性表,则其一般表示为

L = ( a 1 , a 2 , ⋯ , a i , a i + 1 , ⋯ , a n ) L=\left(a_1, a_2, \cdots, a_i, a_{i+1}, \cdots, a_n\right) L=(a1,a2,,ai,ai+1,,an)

式中, a 1 a_1 a1是唯一的“第一个”数据元素,又称表头元素; a n a_n an是唯一的“最后一个”数据元素,又称表尾元素。除第一个元素外,每个元素有且仅有一个直接前驱。除最后一个元素外,每个元素有且仅有一个直接后继。

线性表有以下特性:

  • 表中元素的个数有限。
  • 表中元素具有逻辑上的顺序性,表中元素有其先后次序。
  • 表中元素都是数据元素,每个元素都是单个元素。
  • 表中元素的数据类型都相同,这意味着每个元素占有相同大小的存储空间。
  • 表中元素具有抽象性,即仅讨论元素间的逻辑关系,而不考虑元素究竟表示什么内容。

存储结构

顺序存储

它是用一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。第1个元素存储在顺序表的起始位置,第i个元素的存储位置后面紧接着存储的是第 i + 1 i+1 i+1个元素,称 i i i为元素 a i a_i ai在顺序表中的位序。因此,顺序表的特点是表中元素的逻辑顺序与其存储的物理顺序相同

假设顺序表L存储的起始位置为LOC(A),sizeof(ElemType)是每个数据元素所占用存储空间的大小。

在这里插入图片描述

typedef struct {ElemType data[Maxsize];int length;
} SqList;

存在的问题:

  • 需要大量连续的存储空间
  • 插入删除时,时间复杂度高
  • 顺序表一旦确定大小,后续将不可扩充

链式存储

链式存储线性表时,不需要使用地址连续的存储单元,即不要求逻辑上相邻的元素在物理位置上也相邻,它通过“链”建立元素之间的逻辑关系,因此插入和删除操作不需要移动元素,而只需修改指针,但也会失去顺序表可随机存取的优点

单链表

在这里插入图片描述

typedef struct LNode {ElemType data;struct LNode *next;
} LNode, *LinkList;

存在的问题:

  • 失去了顺序存储中随机存取的特性
  • 求表长的时间复杂度高
  • 访问前驱结点的时间复杂度高

双链表

在单链表中要访问某个结点的前驱(插入、删除操作时),只能从头开始遍历,访问前驱的时间复杂度为 O ( n ) O(n) O(n)。为了克服单链表的这个缺点,引入了双链表,双链表结点中有两个指针priornext,分别指向其直接前驱和直接后继。表头结点的 prior域和尾结点的 next 域都是 NULL

在这里插入图片描述

typedef struct DNode {ElemType data;struct DNode *next, prior;
} DNode, *DLinkList;

循环单链表

循环单链表和单链表的区别在于,表中最后一个结点的指针不是NULL,而改为指向头结点,从而整个链表形成一个环。

在这里插入图片描述

循环双链表

由循环单链表的定义不难推出循环双链表。不同的是,在循环双链表中,头结点的prior指针还要指向表尾结点。

在这里插入图片描述

静态链表

静态链表是用数组来描述线性表的链式存储结构,结点也有数据域data 和指针域 next,与前面所讲的链表中的指针不同的是,这里的指针是结点在数组中的相对地址(数组下标),又称游标

在这里插入图片描述

typedef struct {ElemType data;int next;
} SLinkList[Maxsize];

数据的操作

顺序结构

初始化

void InitList(SqList &L)
{L.length = 0;
}

判满

bool isFull(SqList L)
{if (L.length == Maxsize) return true;return false;
}

判空

bool isEmpty(SqList L)
{if (L.length == 0) return true;return false;
}

插入操作

bool ListInsert(SqList &L, int i, ElemType e)
{if (i < 1 || i > L.length + 1)				// 无效的插入位置return false;if (isFull(L)) return false;				// 存储空间已满for (int j = L.length; j >= i; j -- )L.data[j] = L.data[j - 1];L.data[i - 1] = e;L.length ++ ;return true;
}

删除操作

bool ListDelete(SqList &L, int i, ElemType e)
{if (i < 1 || i > L.length + 1)				// 无效的删除位置return false;if (isEmpty(L)) 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;
}

按值查找

int LocateElem(SqList L, ElemType e)
{for (int i = 0; i < L.length; i ++ )if (L.data[i] == e)return i + 1;return -1;
}

链式结构

单链表

初始化

void InitList(LinkList &L)
{L = (LNode *) malloc (sizeof(LNode));L->next = NULL;
}

求表长

int Length(LinkList L)
{LNode *p = L->next;int cnt = 0;			// 记录长度while (p){cnt ++ ;p = p->next;}return cnt;
}

按序号查找结点

LNode * GetElem(LinkList L, int i)
{LNode *p = L->next;int cnt = 0;						// 记录当前遍历到第几个结点了while (p){cnt ++ ;if (cnt == i)return p;p = p->next;}return NULL;
}

按值查找

LNode * LocateElem(LinkList L, ElemType e)
{LNode *p = L->next;while (p){if (p->data == e)return p;p = p->next;}return NULL;
}

插入结点

在这里插入图片描述

bool ListInsert(LinkList &L, int i, ElemType e)
{LNode *p = L;int j = 0;while (p && j < i - 1){p = p->next;j ++ ;}if (p == NULL) return false;		// 位置不合法LNode *s = (LNode *) malloc (sizeof(LNode));/*插入结点*/s->data = e;s->next = p->next;p->next = s;return true;
}

删除结点
在这里插入图片描述

bool ListDelete(LinkList &L, int i, ElemType e)
{LNode *p = L;int j = 0;while (p && j < i - 1){p = p->next;j ++ ;}if (p == NULL || p->next == NULL) return false;		// 位置不合法LNode *q = p->next;/*删除结点q*/e = q->data;p->next = q->next;free(q);return true;
}

采用头插法建立链表

在这里插入图片描述

LinkList List_HeadInsert(LinkList &L)
{LNode *s;int x;L = (LNode *) malloc (sizeof(LNode));L->next = NULL;scanf("%d", &x);while (x != 9999)		// 输入9999停止{s = (LNode *) malloc (sizeof(LNode));s -> data = x;s->next = L->next;L->next = s;scanf("%d", &x);}return L;
}

采用尾插法建立链表

在这里插入图片描述

LinkList List_TailInsert(LinkList &L)
{int x;L = (LNode *) malloc (sizeof(LNode));LNode *s, *r = L;		// r是表尾指针scanf("%d", &x);while (x != 9999)		// 输入9999停止{s = (LNode *) malloc (sizeof(LNode));s -> data = x;r->next = s;r = s;scanf("%d", &x);}r->next = NULL;return L;
}

双链表

初始化

void InitList(DLinkList &L)
{L = (DNode *) malloc (sizeof(DNode));L->next = L->prior = NULL;
}

插入结点

在这里插入图片描述

bool ListInsert(DLinkList &L, int i, ElemType e)
{DNode *p = L;int j = 0;while (p && j < i - 1){p = p->next;j ++ ;}if (p == NULL) return false;		// 位置不合法DNode *s = (DNode *) malloc (sizeof(DNode));/*插入结点*/s->data = e;s->next = p->next;p->next->prior = s;s->prior = p;p->next = s;return true;
}

删除结点

bool ListDelete(DinkList &L, int i, ElemType e)
{DNode *p = L;int j = 0;while (p && j < i - 1){p = p->next;j ++ ;}if (p == NULL || p->next == NULL) return false;		// 位置不合法DNode *q = p->next;/*删除结点q*/e = q->data;p->next = q->next;q->next->prior = p;free(q);return true;
}

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

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

相关文章

力扣:777. 在LR字符串中交换相邻字符

777. 在LR字符串中交换相邻字符 在一个由 L , R 和 X 三个字符组成的字符串&#xff08;例如"RXXLRXRXL"&#xff09;中进行移动操作。一次移动操作指用一个 "LX" 替换一个 "XL"&#xff0c;或者用一个 "XR" 替换一个 "RX"…

IT行业已经饱和?2024年报考计算机类专业还有出路吗?

&#x1f446;点击关注 获取更多编程干货&#x1f446; “高薪”光环加持&#xff0c;IT行业一直是不少人心仪的职业选择&#xff0c;计算机专业一度成为最热门的本科专业。 然而&#xff0c;正因报考计算机专业、想要入行IT行业的人越来越多&#xff0c;“行业饱和”、“人才…

NB65 第k轻的牛牛

描述 在农场里&#xff0c;农民们有一群牛&#xff0c;每头牛的体重不同。农民们将所有牛的体重记录在一个数组中。现在农民们想要知道&#xff0c;如果将这些牛的体重从小到大排序&#xff0c;那么第k小的体重是多少。请你编写一个程序&#xff0c;找出数组中第k小的元素。 你…

MySQL(一) 库和表的基础操作

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a;磁盘内存 为了解…

增强ev代码签名证书2300

代码签名证书是软件开发者们确保软件完整性和安全性的重要工具之一。在各种类型的代码签名证书中&#xff0c;增强EV代码签名证书拥有许多独特的功能而受到企业开发者的欢迎&#xff0c;今天就随SSL盾小编了解增强EV代码签名证书的申请条件以及申请流程。 1.增强型EV代码签名证…

【小程序 按钮 表单 】

按钮 代码演示 xxx.wxml <view class"boss" hover-class"box"hover-start-time"2000"hover-stay-time"5000">测试文本<view hover-stop-propagation"true">子集</view><view>子集2</view>…

Web基础考点

&#xff08;面试准备版&#xff09;基于CTF Wiki的总结和思考 WEB类的题目包括&#xff1a;SQL注入、XSS跨站脚本攻击、CSRF跨站请求伪造、文件上传、框架安全、PHP常见漏洞、代码审计Wiki中没提到的还包括&#xff1a;Java安全、Nodejs原型链污染、XXE、SSRF、逻辑漏洞等&am…

相关服务器介绍

服务器是一种高性能的计算机&#xff0c;它被设计用来为其他计算机或终端设备提供服务&#xff0c;如数据处理、文件存储、网络通信等。服务器通常具有强大的计算能力、大容量的存储空间和高效的网络连接能力。 常见的服务器种类及其特点 文件服务器 文件服务器主要负责中央存储…

Lua常用C Api接口

Lua 5.4 是 Lua 语言的一个版本&#xff0c;它提供了许多 C API 函数&#xff0c;这些函数允许开发者在 C 语言中嵌入和扩展 Lua 的功能。以下是一些常用的 Lua 5.4 C API 函数&#xff0c;以及它们的简单示例&#xff1a; lua_newstate - 创建一个新的 Lua 状态。 lua_State *…

[leetcode]判断是否丑数

在LeetCode上&#xff0c;n丑数问题的描述是&#xff1a; 给你一个整数 n &#xff0c;找出并返回第 n 个 丑数 。 丑数是只包含质因子 2, 3, 5 的正整数。 示例 1: 输入: n 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 这个问题可以通过迭代来解…

mac docker 安装mysql

在Mac上使用Docker安装MySQL的过程可以分为几个步骤&#xff0c;下面是详细的指南&#xff1a; 步骤1&#xff1a;安装Docker 确保你已经在Mac上安装了Docker。如果还没有安装&#xff0c;你可以访问Docker官网(https://www.docker.com/products/docker-desktop)下载Docker D…

C++知识点总结(34):二分查找

二分 一、二分1. 实例2. 意义 二、程序1. 猜数字-次数.cpp2. 二分查找.cpp3. 二维二分查找.cpp4. 正方体的体积算棱长.cpp 一、二分 1. 实例 在猜数字的游戏中&#xff0c;对方想一个 1 − 100 1-100 1−100 之间的数字&#xff0c;并且对方可以告诉你猜的数字是大了还是小了…

Echarts图表使用

ECharts是一个用JS实现开源可视化库&#xff0c;它提供了丰富的图表类型和交互能力。使用户可以通过简单的配置生成各种各样的图表。 先安装ECharts图表直接下载echarts.min.js并用<script>标签引入也可以使用源代码版本echarts.js并用<script>标签引入&#xff0…

【前端】面试八股文——原型链

【前端】面试八股文——原型链 1. 什么是原型链&#xff1f; 在JavaScript中&#xff0c;每个对象都有一个原型&#xff08;prototype&#xff09;&#xff0c;而原型本身又可能是另一个对象的原型。通过这种链式关系&#xff0c;可以实现属性和方法的继承&#xff0c;这就是…

华为机考入门python3--(29)牛客29-字符串加解密

分类&#xff1a;字符变换 知识点&#xff1a; 字符是字母 char.isalpha() 字符是小写字母 char.islower() 字符是数字 char.isdigit() b变C chr((ord(b) - ord(a) 1) % 26 ord(A)) 题目来自【牛客】 # 加密 def encrypt_string(s):result ""for ch…

【算法】决策单调性优化DP

文章目录 决策单调性四边形不等式决策单调性 形式1法1 分治法2 二分队列例题 P3515Solution 形式2例题 P3195Solution 形式3例题 CF833BSolution 形式4例题Solution 后话 决策单调性 四边形不等式 定义: 对于二元函数 w ( x , y ) w(x,y) w(x,y)&#xff0c;若 ∀ a , b , …

强烈推荐 20.7k Star!企业级商城开源项目强烈推荐!基于DDD领域驱动设计模型,助您快速掌握技术奥秘,实现业务快速增长

更多资源请关注纽扣编程微信公众号 1 项目简介 商城是个从零到一的C端商城项目&#xff0c;包含商城核心业务和基础架构两大模块,推出用户、消息、商品、订单、优惠券、支付、网关、购物车等业务模块&#xff0c;通过商城系统中复杂场景&#xff0c;给出对应解决方案。使用 …

Linux网络编程:HTTP协议

前言&#xff1a; 我们知道OSI模型上层分为应用层、会话层和表示层&#xff0c;我们接下来要讲的是主流的应用层协议HTTP&#xff0c;为什么需要这个协议呢&#xff0c;因为在应用层由于操作系统的不同、开发人员使用的语言类型不同&#xff0c;当我们在传输结构化数据时&…

golang windows环境下集成swag的步骤

1、设置环境变量GOBIN%GOPATH%\bin 2、下载依赖包 go get github.com/swaggo/swag/cmd/swag 3、编译swag&#xff0c;进入目录 cd $GOPATH\pkg\mod\github.com\swaggo\swagv1.7.4\cmd\swag 执行&#xff1a;go install 执行结束后就会发现在GOBIN目录下生成了一个 swag.ex…