顺序表(详解)- C++(线性表顺序存储结构)

article/2025/9/23 7:18:10

问题引入

        在数据结构中,线性表是一种很重要的线性结构。线性表分为多种类型,常见的如顺序表、链表等,如果此时此刻你对“顺序表(顺序存储)”感到困惑,那就继续看下去,我们一步一步去剖析。

        如果你想要进一步了解“链表”——1.“顺序创建(尾插法)”、2.“逆序创建(头插法)”,

        请参考文章 : 1. “链表(详解)- C++(顺序创建链表-尾插法)”(点击查看)

                              2.  “链表(详解)- C++(逆序创建链表-头插法)”(点击查看)。

问题分析

        如果想要搞明白“线性表”,首先你要明白两个问题:

        1.什么是线性表?

        答:一个“线性表”(linear list)是n个数据元素的有限序列。

        2.“顺序表(顺序存储)”的特点是什么?

        答:(1)顺序表顺序存储 可随机存取,即可以任意从任何一个位置插入、删除元素。

                (2)用一组连续的存储单元储存线性表的数据元素(这组存储单元必须是连续的)。也即“使用数组对元素进行存储”。

                (3)表中元素个数叫表长,元素个数可以有多个,也可以为0。某个元素的上一个元素叫直接前驱元素,下一个元素叫直接后继元素。

                (4)优点:可以快速存储表中任意位置的元素的值;无需为表中的逻辑关系增加额外的存储空间。

                (5)缺点:插入和删除元素需移动大量的元素;容易生成存储空间"碎片"。

顺序表整体结构分析

        顺序表 也即 线性表的一种顺序存储结构,用一组连续的存储单元储存线性表的数据元素(这组存储单元必须是连续的)。也即“使用数组对元素进行存储”。我们可以借助数组的思想实现顺序表的顺序存储,分配依次存储空间后,接下来我们就可以根据位置插入、删除元素,如下图,如果仍然感到困惑,接下来我们分过程去看元素入“顺序表”和出“顺序表”的过程。

 

元素入顺序表分析

        对于顺序表而言,采用的是“顺序存储”的方式,因此我们只要指定好一定空间,按照位置进行插入元素即可,只要该位置无元素或者顺序表未满,那么就可以在指定位置插入数据,而不用事先设置指针指向该位置。

        例如:

                        在链队列中插入元素33。

        分析:首先对顺序表进行“遍历”,查找指定位置或者找到一个空位插入数据,“插入”的实质其实就是先将表长 +1,之后将“指定位置”后的所有元素向后移动一个位置“从后向前”依次后移,避免数据被前面的元素覆盖,如图1、2。

        (务必注意: “表长”的变化 和 移动的方向。)

图1

 

图2

元素出顺序表分析

          例如:

                        在链队列中删除元素33。

        明白了元素入顺序表,那么元素的出顺序表与入顺序表过程相似。分析:首先对顺序表进行“遍历”,查找指定位置上的元素,“删除”的实质其实就是查找到要删除的元素,然后将“指定位置”后的所有元素向前移动一个位置,即覆盖要删除的元素,最后表长 -1“从前向后”依次前移,每一个元素覆盖上一个元素,如图1、2。

     (务必注意: “表长”的变化 和 移动的方向。)

图1

 

 

图2

代码实现

        说明:采用C++语言,编译环境为DevC++。

//导入头文件
#include<malloc.h>
#include<iostream>
using namespace std;//定义线性表
typedef struct{int *elem;//数据元素int length;//当前长度int listsize;//存储容量
}SqList;//初始化线性表
void InitSqList(SqList &L){L.elem=(int *) malloc(50*sizeof(int));L.length=0;//空表L.listsize=50;
}//创建顺序表 
void CreatSqList(SqList &L){int i=0;cout<<"请输入数据,以-10000结束:"<<endl;cin>>L.elem[i];while(L.elem[i]!=-10000 && L.length<L.listsize){++L.length;i++;cin>>L.elem[i];}
}//输出
void PrintSqList(SqList &L){int i;cout<<"\n线性表中的全部元素为:\n";for(i=0;i<L.length;i++)cout<<L.elem[i]<<' ';cout<<endl<<endl;
}//查找,若不存在输出0
int LocateSqList(SqList L,int e){int i=0;int *p=L.elem;while(i<L.length){p++;i++;if((*p)==e)return i+1;if(i==L.length) return 0;}
}//插入
int InsertSqList(SqList &L,int i,int h){int *p;int *q;p=&(L.elem[L.length+1]);q=&(L.elem[i-1]);for(p;p>=q;p--)*p=*(p-1);++L.length;//插入前 表长+1 *(q)=h;return 0;//返回0表示成功
}//删除
int DeleteSqList(SqList &L,int m){int *p;int *q;p=&(L.elem[L.length]);q=&(L.elem[m]);for(q;q<p;q++)*(q-1)=*q;--L.length;//删除后 表长-1 return 0;//返回0表示成功
}//主函数
int main(){SqList L;int e;int i;int h;int m;InitSqList(L);CreatSqList(L);PrintSqList(L);cout<<"请输入要查找的数据元素:"<<endl;cin>>e;cout<<"数据"<<e<<"在表中第 "<<LocateSqList(L,e)<<" 个位置。"<<endl;cout<<"请输入第几个位置插入数据元素:"<<endl;cin>>i;cout<<"请输入要插入的新数据元素:"<<endl;cin>>h;cout<<InsertSqList(L,i,h)<<endl;PrintSqList(L);//输出更改后的线性表cout<<"请输入第几个位置删除数据元素:"<<endl;cin>>m;cout<<DeleteSqList(L,m)<<endl;PrintSqList(L);//输出更改后的线性表
}

运行结果

 

写在最后:

        读两遍下来,如果仍然有不清楚的地方,可在评论区留言。

        如果你有其他感到困惑的问题,欢迎留言。


http://chatgpt.dhexx.cn/article/cnIsrRGD.shtml

相关文章

顺序存储结构的线性表

1.0. 什么是线性表&#xff1f; 所谓线性&#xff0c;即一条线&#xff0c;这条线可以是直线&#xff0c;也可以是曲线。 所谓表&#xff0c;肯定都不陌生&#xff0c;生活中有各种各样的表或者表格。我们在表格中填写各种各样的信息&#xff0c;通过表格&#xff0c;能够很好…

数据结构线性表顺序存储结构和主要算法实现

(1) 线性表的定义。 零个或多个数据元素的有限序列 序列线性表中有直接后继元素&#xff0c;有且仅有一个直接后继&#xff0c;有且仅有一个直接前驱&#xff0c;数据元素之间的关系是一对一的关系 常用的List操作&#xff1a; Operation InitList&#xff08;*L&#xf…

线性表顺序存储结构

1.什么是线性表? 线性表可以看作一条链子除了第一个元素和最后一个元素&#xff0c;其他每个元素都有一个前驱 元素和一个后继元素有且只有一个。 若一个元素都没有&#xff0c;则称为空表。 元素之间的关系是一一对应的关系。(就比如a2的前驱元素只有一个并且一定是a1&#…

线性表的顺序存储结构

线性表的基本概念 线性结构习惯称为线性表&#xff0c;线性表是n(n>0)个数据元素构成的有限序列&#xff0c;表中除第一个元素外的每一个元素&#xff0c;有且只有一个一个前件&#xff1b;除最后一个元素外&#xff0c;有且只有一个后件。 非空数据表具有&#xff1a; 只…

【数据结构】线性表的顺序存储结构及实现——C语言版

文章目录 顺序表1. 顺序表的存储结构定义2. 顺序表的实现2.1 初始化顺序表2.2 建立顺序表2.3 销毁顺序表2.4 判空操作2.5 求顺序表的长度2.6 遍历操作2.7 按值查找2.8 按位查找2.9 插入操作2.10 删除操作 3. 顺序表的使用4. 暖暖树洞 顺序表 线性表的顺序存储结构称为顺序表&a…

VUE activated,deactivated使用

项目中keepalive用得不多&#xff0c;记录一下以免遗忘。 页面第一次进入&#xff0c;钩子的触发顺序created-> mounted-> activated&#xff0c;退出时触发deactivated。当再次进入&#xff08;前进或者后退&#xff09;时&#xff0c;只触发activated。 事件挂载的方…

vue activated,deactivated生命周期的使用

1.当组件在 内被切换&#xff0c;它的 activated 和 deactivated 这两个生命周期钩子函数将会被对应执行。 2.activated()&#xff1a;在vue对象存活的情况下&#xff0c;进入当前存在activated()函数的页面时&#xff0c;一进入页面就触发&#xff1b;可用于初始化页面数据等…

vue 中 keep-alive,activated,deactivated

keep-alive 在组件反复切换时&#xff0c;会反复渲染&#xff0c;造成性能问题。用一个 <keep-alive></keep-alive> 标签将他包裹起来&#xff0c;组件会在第一次被创建的时候缓存下来。避免性能问题。 首先准备好组件&#xff0c;配置好路由。准备了Home,Keep,Abo…

【Vue】学习笔记-Vue Router activated deactivated 路由守卫

Vue Router activated deactivated 路由守卫 activated deactivated路由守卫1.全局守卫2.独享守卫3.组件内守卫全局路由守卫路由器的两种工作模式 activated deactivated activated 和 deactivated 是路由组件所独有的两个钩子&#xff0c;用于捕获路由组件的激活状态 具体使用…

vue 生命周期图 + activated + deactivated

一、vue 生命周期图 From the network 二、activated deactivated 除此之外&#xff0c;简单介绍一下在被keep-alive包含的组件/路由中&#xff0c;会多出两个生命周期的钩子:activated 与 deactivated。在 2.2.0 及其更高版本中&#xff0c;activated 和 deactivated 将会…

[Vue]缓存路由组件 activated()与deactivated()

前言 系列文章目录&#xff1a; [Vue]目录 老师的课件笔记&#xff0c;不含视频 https://www.aliyundrive.com/s/B8sDe5u56BU 笔记在线版&#xff1a; https://note.youdao.com/s/5vP46EPC 视频&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 文章目录 前言1. 缓存…

Vue 钩子函数activated未触发

activated()和deactivated()只有在<keep-alive></keep-alive>包裹的时候才有效&#xff1b;

搞明白activated和deactivated

文章目录 写到前面什么是activatedactivated解决了一个什么问题Demomain.vueassembly1(组件1)assembly2(组件2) 执行结果要点速记个人建议写到最后 写到前面 今天简单的将activated讲一下&#xff0c;前面有人问了&#xff0c;既然有问的&#xff0c;说明还有人不是很明白的&am…

vue中activated

keep-alive <keep-alive>包裹动态组件的时候&#xff0c;会缓存不活动的组件实例&#xff0c;而不是摧毁他们。其是一个抽象的组件&#xff0c;自身不会渲染一个DOM元素&#xff0c;也不会出现在父组件链中。 说白了被<keep-alive>包裹的组件其会被缓存。 没有被…

Vue学习之---动态组件中的activated与deactivated钩子函数

Vue学习之—动态组件中的activated与deactivated钩子函数 在学习这两个钩子函数之前呢&#xff0c;怎么需要先了解下Vue内置的动态组件< component >以及与之相配套的< keep-alive > 组件&#xff1a; 动态组件指的是动态切换组件的显示与隐藏&#xff1b; < …

vue中keep-alive、activated的探讨和使用

在修改公司的一个项目的时候发现了activated这个东西&#xff0c;一直觉得很疑惑&#xff0c;之前也没怎么用过啊&#xff01;官网的生命周期那也没说过这东西啊&#xff01;生命周期不就create mount update 和destory这几个东东么&#xff0c;怎么多了个activate出来。 百思不…

html页面ajax提交数据,ajax请求提交form表单

AJAX表单提交以及数据接收 方式一 手工收集所有的用户输入&#xff0c;封装为大的“k1v1&k2v2…”键值对形式&#xff0c;使用$.post(url, data,fn)把数据提交给服务器 $.ajax({ type:post, url:Notice_noTipsNotice, data:k1v1&k2v2..., cache:false, dataType:json, …

接上篇 jquery.form.js 的 $.ajaxForm()和 $.ajaxSubmit()

2019独角兽企业重金招聘Python工程师标准>>> AjaxSubmit 和AjaxForm区别 AjaxForm ajaxForm()不能提交表单。在document的ready函数中&#xff0c;使用ajaxForm来为AJAX提交表单进行准备。提交动作必须由submit开始 , ajaxForm()适用于以表单提交方式处理ajax技术&a…

springboot ajax form json 请求方式

1.form请求的后台代码 1.定义实体 Student package com.bsx.test.entity;import com.bsx.test.constant.Gender; import com.bsx.test.constant.Nature;import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.io.Seri…

ajax form表单提交 input file中的文件

现今的主流浏览器由于ajax提交form表单无法把文件类型数据提交到后台&#xff0c;供后台处理&#xff0c;可是开发中由于某些原因又不得不用ajax提交文件&#xff0c; 为了解决这个问题我走了不少弯路&#xff1a; 1、用原生的 input file &#xff0c; 不支持ajax上传文件&…