1.1 线性表顺序结构的定义及实现

1. 顺序表定义

  把线性表的结点按逻辑顺序依次存放在一组地址连续的存储单元里。用这种方法存储的线性表简称顺序表。

2.顺序表特点

1)线性表的逻辑顺序与物理顺序一致;
2)数据元素之间的关系是以元素在计算机内“物理位置相邻”来体现。设有非空的线性
表:( a 1 a 2 ,… a n ) 。
3)设线性表的每个元素需占用 1 个存储单元,以所占的第一个单元的存储地址作为数据
元素的存储位置。则线性表中第 i+1 个数据元素的存储位置 LOC(a i+1 ) 和第 i 个数据元素的
存储位置 LOC(a i ) 之间满足下列关系: LOC(ai+1 )=LOC(a i )+l
线性表的第 i 个数据元素 ai 的存储位置为:LOC(ai )=LOC(a 1 )+i*l

3.定义顺序表(c语言)

#define MAXSIZE 100
typedef struct {int data[MAXSIZE];int length;
}SqListStruct, *SqList;/*
1、空间数组是 data
2、最大长度是 MAXSIZE
3、当前元素个数是 length
*/

4.顺序表操作(c语言)

4.1.顺序表创建

SqList list_create() {SqList list =(SqList)malloc(sizeof(SqListStruct));if (list == nullptr) {return nullptr;}list->length = 0;return list;
}

4.2.顺序表插入

在线性表 L= (a 1 ,… a i-1 a i a i+1 ,…, a n ) 中的第 i(1 i n) 个位置上插入一个新
结点 e ,使其成为线性表: L=(a 1 ,… a i-1 e a i a i+1 ,…, a n )
实现步骤
 (1) 将线性表 L 中的第 i 个至第 n 个结点后移一个位置。
 (2) 将结点 e 插入到结点 a i-1 之后。
 (3) 线性表长度加 1
在顺序表上做插入运算,平均要移动表上一半结点。当表长 n 较大时,算法效率相当低。
因此算法的平均时间复杂度为 O(n)
//第i个位置,插入元素e , 注意:i >= 1
bool list_insert(SqList list, int i, int e) 
{if (list == nullptr || list->length > MAXSIZE) {return false;}if (i < 1 || i > list->length + 1) {return false;}for (int k = list->length-1; k >= i-1; k--) {list->data[k + 1] = list->data[k];}list->length += 1;list->data[i - 1] = e;return true;
}

4.3.顺序表按索引删除

在线性表 L=(a 1 ,… a i-1 a i a i+1 ,…, a n ) 中删除结点 a i (1 i n) ,使其成为线性
表: L= (a1 ,… a i-1 a i+1 ,…, a n )
实现步骤
(1) 将线性表 L 中的第 i+1 个至第 n 个结点依此向前移动一个位置。
(2) 线性表长度减 1
在顺序表上做删除运算,平均要移动表上一半结点。当表长 n 较大时,算法的效率相当低。
因此算法的平均时间复杂度为 O(n)
//删除第i个元素,并将被删除的元素值存入e存储单元,注意:i >= 1 
bool list_delete(SqList list, int i, int* e) {if (list == nullptr || list->length == 0) {return false;}if (i < 1 || i > list->length) {return false;}if (e != nullptr) {*e = list->data[i - 1];}for (int k = i; k < list->length; k++) {list->data[k - 1] = list->data[k];}list->length -= 1;return true;
}

4.4.顺序表按值删除

在线性表 L= (a 1 a 2 ,…, a n ) 中删除值为 x 的第一个结点。
实现步骤
1 )在线性表 L 查找值为 x 的第一个数据元素。
2 )将从找到的位置至最后一个结点依次向前移动一个位置。
3 )线性表长度减 1
平均时间复杂度: O(n)
//删除值为e的第一个元素
bool list_delete(SqList list, int e) 
{if (list == nullptr || list->length == 0) {return false;}for (int i = 0; i < list->length; i++) {if (list->data[i] == e) {for (int k = i+1; k < list->length; k++) {list->data[k-1] = list->data[k];}list->length--;return true;}}return false;
}

4.5.打印顺序表(辅助)

bool print_sqlist(SqList list) {if (list == nullptr || list->length <= 0) {return false;}printf("[");for (int i = 0; i < list->length; i++) {printf("%d", list->data[i]);printf("%s", i == list->length-1 ? "" : ",");}printf("]\n");return true;
}

5.顺序表总结

1、空间连续,逻辑相邻,物理位置也相邻
2、指定位置访问 O(1),随机访问
3、插入和删除元素往往会移动大量元素以使元素空间连续
4、扩展相对困难,因为可能不存在大区域的连续内存空间
5、空间连续,随机访问,查找容易,增删难

6.附件代码

namespace NS_02_SQLIST{#define MAXSIZE 100typedef struct {int data[MAXSIZE];int length;}SqListStruct, *SqList;SqList list_create() {SqList list =(SqList)malloc(sizeof(SqListStruct));if (list == nullptr) {return nullptr;}list->length = 0;return list;}bool list_free(SqList list) {if (list == nullptr) {return false;}free(list);return true;}//第i个位置,插入元素e , 注意:i >= 1bool list_insert(SqList list, int i, int e) {if (list == nullptr || list->length > MAXSIZE) {return false;}if (i < 1 || i > list->length + 1) {return false;}for (int k = list->length-1; k >= i-1; k--) {list->data[k + 1] = list->data[k];}list->length += 1;list->data[i - 1] = e;return true;}//删除第i个元素,并将被删除的元素值存入e存储单元,注意:i >= 1 bool list_delete(SqList list, int i, int* e) {if (list == nullptr || list->length == 0) {return false;}if (i < 1 || i > list->length) {return false;}if (e != nullptr) {*e = list->data[i - 1];}for (int k = i; k < list->length; k++) {list->data[k - 1] = list->data[k];}list->length -= 1;return true;}//删除值为e的第一个元素bool list_delete(SqList list, int e) {if (list == nullptr || list->length == 0) {return false;}for (int i = 0; i < list->length; i++) {if (list->data[i] == e) {for (int k = i+1; k < list->length; k++) {list->data[k-1] = list->data[k];}list->length--;return true;}}return false;}bool print_sqlist(SqList list) {if (list == nullptr || list->length <= 0) {return false;}printf("[");for (int i = 0; i < list->length; i++) {printf("%d", list->data[i]);printf("%s", i == list->length-1 ? "" : ",");}printf("]\n");return true;}void test1() {printf("%d\n", sizeof(SqListStruct));}void test2() {SqList list = list_create();list_insert(list, 1, 10);list_insert(list, 2, 20);list_insert(list, 3, 30);list_insert(list, 4, 40);list_insert(list, 2, 15);print_sqlist(list);list_delete(list, 1, nullptr);print_sqlist(list);list_delete(list, 4, nullptr);print_sqlist(list);list_free(list);}void test3() {SqList list = list_create();list_insert(list, 1, 10);list_insert(list, 2, 20);list_insert(list, 3, 30);list_insert(list, 4, 40);print_sqlist(list);list_delete(list, 20);print_sqlist(list);list_free(list);}void main() {test3();}
};

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

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

相关文章

将手机作为服务器运行docker服务

前言 目前手机的配置并不低&#xff0c;即使是2019年生产的一加七Pro&#xff0c;配置也有12256&#xff0c;CPU是骁龙855&#xff0c;作为服务器运行着配置绰绰有余了&#xff0c;二手的价格现在是400左右也能接受。相对于是自带ups电源的便携低耗docker服务器&#xff0c;还…

分布式事务和2阶段提交

在当今世界&#xff0c;数据正在以惊人的速度增长。单台计算机的存储容量是有限的&#xff0c;因此需要将数据分布在多台机器或数据库上&#xff0c;这种技术被称为分布式技术。 互联网大厂中很多系统都在采用微服务架构。在这种架构中&#xff0c;每个微服务都管理自己的数据…

NXP i.MX 6系列处理器加入“产品长期供货计划”

近期&#xff0c;NXP&#xff08;恩智浦半导体&#xff09;的i.MX 6系列处理器已加入其“产品长期供货计划”&#xff0c;不同型号处理器的生命周期得到了10~15年的延长&#xff0c;确保了长期稳定的供货与维护。 &#xff08;NXP产品长期供货计划的目的&#xff0c;是给客户的…

pycharm关闭项目时,页面卡住了,怎么办?

问题 在关闭pycharm时&#xff0c;有时会遇到卡在退出进度条的界面&#xff0c;很讨厌&#xff0c;那我们要怎么办才能退出呢&#xff1f; 说明&#xff1a;本篇文章不是从根源上解决这个问题&#xff0c;无法避免这种情况。 解决方法 方法一&#xff1a; 在卡住时&#xf…

Redis 7.x 系列【27】集群原理之通信机制

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2 节点和节点2.1 集群拓扑2.2 集群总线协议2.3 流言协议2.4 心跳机制2.5 节点握…

【推研小灶】复旦与南大之间:一次独特的计算机保研之旅

写在前面 上午10点填完志愿等待复试通知&#xff0c;利用这段时间记录一下我简短的夏令营和预推免。今年变为线下之后&#xff0c;部分学校的入营情况、考核方式有明显变化。加上CS方向保研名额总体变多&#xff0c;形势有点小乱&#xff0c;甚至填报系统都在9.29中秋节当天&a…

Python如何获取终端尺寸?

os.get_terminal_size()&#xff0c;无差别获取当前终端长宽&#xff0c;让你为所欲为。 (笔记模板由python脚本于2024年07月27日 08:30:53创建&#xff0c;本篇笔记适合喜欢钻研的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fre…

【Python系列】Parquet 数据处理与合并:高效数据操作实践

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

unity2D游戏开发08脚本化对象

创建Scriptable Object 在scripts文件夹下创建一个名为Sriptable Objects的文件夹,然后在文件夹里面创建一个名为Item的脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;//[CreateAssetMenu] 是一个属性(Attribute),用于告诉Unity编…

非UI设计师勿入,英文B端界面的确有可取之处.

作为中文的UI设计师&#xff0c;可以从英文B端界面中汲取设计灵感的几种方法&#xff1a; 观察布局和结构&#xff1a; 注意英文B端界面的布局和结构&#xff0c;包括导航栏、侧边栏、内容区域等。观察它们的排列方式、比例和空白间隙的运用&#xff0c;可以借鉴到自己的设计中…

GeoHash原理介绍以及在redis中的应用

GeoHash将二维信息编码成了一个一维信息。降维后有三个好处&#xff1a; 编码后数据长度变短&#xff0c;利于节省存储。利于使用前缀检索当分割的足够细致,能够快速的对双方距离进行快速查询 GeoHash是一种地址编码方法。他能够把二维的空间经纬度数据编码成一个字符串。 1…

十一、【Python】基础教程-【Python全掌握】六大基础数据类型:布尔类型的终极指南

目录 一、基础类型“布尔型”处理方法 1. 直接赋值和使用 2. 布尔值的逻辑运算 3. 条件语句中的布尔值 4. 布尔值转换 5. 短路逻辑 6. 在循环和迭代中的使用 一、基础类型“布尔型”处理方法 在Python中&#xff0c;布尔类型是一种基本的数据类型&#xff0c;用于表示逻…

3DMAX一键藤球建模插件RattanBall使用方法

3DMAX一键藤球建模插件RattanBall使用教程 3DMAX藤球建模插件RattanBall&#xff0c;一键创建藤球模型&#xff0c;可以设置藤球大小、嵌套层数等&#xff0c;简单实用&#xff0c;一键生成&#xff01; 【适用版本】 3dMax2018.2及更高版本 【安装方法】 3DMAX一键藤球建模插…

Animate软件基础:创建及插入关键帧

这里讲一下Animate软件中创建或插入关键帧的基本方法。 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.com/p/677437436 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animat…

UE5.4内容示例(1)- 学习笔记

https://www.unrealengine.com/marketplace/zh-CN/product/content-examples 《内容示例》是学习UE5的基础示例&#xff0c;可以用此示例熟悉一遍UE5的功能 模型与材质部分 StaticMeshes FBX_Import_Options Material_Advanced Material_Decals Material_Instances Material_N…

SpringBoot教程(十七) | SpringBoot集成swagger

SpringBoot教程&#xff08;十七&#xff09; | SpringBoot集成swagger 一、Swagger的简述二、SpringBoot集成swagger21. 引入依赖2. 新建SwaggerConfig配置类当 SpringBoot为2.6.x及以上时 需要注意 3.配置Swagger开关4. 给Controller 添加注解&#xff08;正式使用&#xff0…

Radxa ROCK 5B+开发板基本配置和上手测试

目录 1.ROCK 5B Plus开发板是什么&#xff1f;2.烧录官方系统3.设置ROOT用户4.开发板温度情况5.VNC远程桌面配置6.WIFI模块测速7.M2接口使用注意8.总结 1.ROCK 5B Plus开发板是什么&#xff1f; ROCK 5B&#xff08;即ROCK 5B Plus&#xff0c;本文用ROCK 5B指代&#xff09; …

AMQP-核心概念-4

本文参考以下链接摘录翻译&#xff1a; https://www.rabbitmq.com/tutorials/amqp-concepts 绑定 (Bindings) 绑定是交换机用来将消息路由到队列的规则。为了让一个交换机E将消息路由到队列Q&#xff0c;Q必须绑定到E。绑定可以有一个可选属性routing key&#xff0c;有一些类…

VTX326蓝牙TTS语音合成芯片赋能电子称重一体机人机交互新革新

引言 随着科技的飞速发展&#xff0c;零售业正经历着前所未有的变革。北京宇音天下科技有限公司&#xff0c;作为行业的领跑者&#xff0c;推出了革命性的VTX326蓝牙TTS语音合成芯片&#xff0c;为超市、水果店、熟食店、麻辣烫店等零售业态带来了智能化的全新体验。 市场与趋…