问题引入

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

如果你想要进一步了解“链表”——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);//输出更改后的线性表
}

运行结果

写在最后:

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

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

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

  1. 建oracle簇表,详解ORACLE簇表、堆表、IOT表、分区表

    详解ORACLE簇表.堆表.IOT表.分区表 簇和簇表 簇其实就是一组表,是一组共享相同数据块的多个表组成.将经常一起使用的表组合在一起成簇可以提高处理效率. 在一个簇中的表就叫做簇表.建立顺序是:簇 ...

  2. mysql 联表详解_MySQL多表查询详解

    多表查询 1. 表与表之间的关系 <1> 一对一用户表和身份信息表,用户表是主表 男人表.女人表 create table man(mid int primary key auto_inc ...

  3. 判断数组中某个元素除自身外是否和其他数据不同_算法工程师要懂的3种算法数据结构:线性表详解...

    算法思想有很多,业界公认的常用算法思想有8种,分别是枚举.递推.递归.分治.贪心.试探法.动态迭代和模拟.当然8种只是一个大概的划分,是一个"仁者见仁.智者见智"的问题. 其实这些 ...

  4. 线性表详解(静态链表、单链表、双向链表、循环链表)

    目录 申明 1. 线性表的定义 2. 线性表的抽象数据类型 3. 线性表的顺序存储结构 3. 1 顺序存储定义 3. 2 顺序存储方式 3. 3 数据长度与线性表长度区别 3. 4 地址计算方法 4. ...

  5. DZ各个数据表详解(DZ论坛各表详细说明,二次开发用)

    DZ各个数据表详解(DZ论坛各表详细说明,二次开发用) DZ默认库的53个数据表 cdb_access (用户权限表) uid 用户id fid 论坛id allowview 允许浏览 allowpo ...

  6. 【ZZ】详解哈希表的查找

    详解哈希表的查找 https://mp.weixin.qq.com/s/j2j9gS62L-mmOH4p89OTKQ 详解哈希表的查找 2018-03-01 算法与数据结构 来自:静默虚空 http: ...

  7. mysql数据库表分区_MySQL数据库之MySQL的分区和分表详解

    本文主要向大家介绍了MySQL数据库之MySQL的分区和分表详解 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1. 分区 MySQL中的分区是指将一个数据表按照某种规则(如时 ...

  8. 二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解

    二叉树,平衡二叉树,B-Tree,B+Tree,跳表详解 1.二叉查找树(BST) 1.1 二叉查找树概念 1.2 二叉查找树特点 2. 平衡二叉树(AVL) 2.1 平衡二叉树概念 2.2 平衡二叉 ...

  9. 什么是线性表?什么是线性表的顺序存储结构?什么是线性表的链式存储结构?

    1.线性表是最简单也是最常用的一种数据结构.线性表的例子不胜枚举,例如,英文字母表就是一个线性表,表中的英文字母是一个数据元素. 2.线性表的定义:线性表是具有相同特性的数据元素的一个有限序列. 3. ...

  10. 数据结构(C语言第二版)严蔚敏编,数据结构电子教材,线性表,栈,队列,顺序存储结构,初始化,入栈,出栈,入队,出队,c++

    前言 提示:本篇文章收录严蔚敏编写的数据结构C语言版本 简单介绍一下顺序表,顺序栈,循环队列,的顺序存储结构之间的区别 代码参考严蔚敏编写的<数据结构>,二维码动态演示可扫码可观看. - ...

最新文章

  1. 解决windows7下vs2008不能正常编译ActiveX控件的问题
  2. 背水一战 Windows 10 (83) - 用户和账号: 数据账号的添加和管理, OAuth 2.0 验证
  3. 安卓最好用的浏览器_iOS最好用的浏览器,没有之一!
  4. 什么是用户对计算机进行配置的重要工具,《计算机常用工具软件》试题1
  5. 这款网络排查工具,堪称神器!
  6. java(1)——用notepad++编译java(javac.exe)
  7. Jinja的基础知识
  8. 存储计算解耦合,构建中国人英语语音数据库
  9. 《Java技术》第一次作业
  10. 2008年度一个下岗程序员的真实经历
  11. android银河城游戏,Endless Memories安卓版
  12. 2022-2028年中国工业互联网预测性维护(PdM)行业市场调查及未来前景预测报告
  13. Java中XML运用总结
  14. 让新股抢跑 -- 富途证券上线港股暗盘交易功能
  15. Zig-Zag模式填充矩阵
  16. 谷歌seo工具有哪些
  17. python编写MySQL数据库查询/操作软件代码
  18. 安卓开发设置系统文件夹下图片为控件背景
  19. centso7.2上mysql安装
  20. JavaSE最新版(二)面向对象、String类、ArrayList

热门文章

  1. (最详细)小米MIX的Usb调试模式在哪里打开的教程
  2. 研讨会 | “数据星河”系列活动—大数据人才培养现状和思考
  3. 【283期】面试官问:高并发场景下,如何保证全局唯一分布式 ID 生成?
  4. 掌握了2-3-4树也就掌握了红黑树,不信进来看看,建议收藏!
  5. 含文档+PPT+源码等]精品基于Nodejs实现的拼车平台[包运行成功]Nodejs毕业设计计算机项目源码
  6. ASP.NET AJAX---UpdateProgress控件小实例 (实现进度条设置显示图片时间)
  7. oracle 横向列变为纵向列
  8. 【着色器实现Distorted Outline外描边轮廓扭曲效果_Shader效果第二篇】
  9. 【创意】9个令人尖叫的环保品牌创意
  10. 读取所有的AppSettings的值