顺序表的基本操作实现
目录
1. 顺序表的定义
2. 顺序表的基本操作的实现
(1) 插入操作
(2) 删除操作
(3) 按值查找(顺序查找)
1. 顺序表的定义
线性表的顺序存储又称顺序表。它是一组地址连续的存储单元依次存储线性表中的数据元素,从而使得逻辑上相邻的两个元素在物理位置上也相邻。
假定线性表的元素类型为 ElemType ,则线性表的顺序存储类型描述为:
#define MaxSize 50 //定义线性表的最大长度
typedef struct{ElemType data[MaxSize]; //顺序表的元素int length; //顺序表的当前长度
}SqList; //顺序表的类型定义
一维数组可以是静态分配的,也可以是动态分配的。 在静态分配时,由于数组的大小和空间事先已经固定,一旦空间占满,再加入新的数据将会产生溢出,进而导致程序崩溃。
而在动态分配时,存储数组的空间是程序在执行过程中通过动态存储语句分配的,一旦数据空间占满,就另外开辟一块更大的存储空间,用以替换原来的存储空间,从而达到扩充存储数组空间的目的,而不需要为线性表一次性的划分所有空间。
#define MaxSize 100 //表长度的初始定义
typedef struct{ElemType *data; //指示动态分配数组的指针int MaxSize,length; //数组的最大容量和当前个数
}SeqList; //动态分配数组顺序表的类型定义
C的初始动态分配语句为:
L.data = (ElemType*)malloc(sizeof(ElemType)*InitSize);
C++ 的初始动态分配语句为:
L.data = new ElemType[InitSize];
2. 顺序表的基本操作的实现
一个线性表的基本操作是指其最核心、最基本的操作。其他比较复杂的操作可通过调用其基本操作来实现。线性表的主要操作如下:
(1) 初始化
为顺序表L动态分配一个预定义大小的数组空间,使 data 指向这段空间的基地址。将表的当前长度设为0。
bool InitList(SqList &L){
//本算法用于实现初始化顺序表LL.data = new ElemType[MaxSize]; //为顺序表分配一个大小为MaxSize的数组空间if(!L.data)exit(OVERFLOW); //存储分配失败退出l.length = 0; //表长度为0return true;
}
(2) 取值
取顺序表L的第1 <= i <= L.length 个位置元素值,并用e返回。若i的输入不合法,则返回 false ,表示取值失败。
bool GetElem(SqList L, int i, ElemType e){
//本算法用于实现获取顺序表L中第i个元素的值if(i <= 1||i >= L.length) //判断i值是否合理return false;e = L.data[i-1];return true;
}
(3) 插入操作
在顺序表L的第 1 <= i <= L.length+1 个位置插入新元素e。若i的输入不合法,则返回 false ,表示插入失败;否则,将顺序表的第i个元素及其后的所有元素右移一个位置,腾出一个空位置插入新的元素e,顺序表长度加1,插入成功,返回 true 。
bool ListInsert(SqList &L, int i, ElemType e){
//本算法实现将元素e插入到顺序表L中第i个位置if(i < 1||i > L.length+1) //判断i的范围是否有效return false;if(L.length >= MaxSize) //判断是否超出数组的最大范围return false;for(int j = L.length; j >= i; j--) //将i个元素及之后的元素后移L.data[j] = L.data[j-1];L.data[i-1] = e; //在i位置处插入eL.length++; //线性表长度加1return true;
}
最好情况:在表位插入,时间复杂度为O(1).
最坏情况:在表头插入,时间复杂度为O(n).
平均情况:假设是在第i个位置上插入一个结点的概率,则在长度为 n 的线性表中插入一个结点时,所需移动结点的平均次数为O((1+n)/2)
因此,线性表插入算法的时间复杂度为 O(n).
(4) 删除操作
顺序表L的第 1 <= i <= L.length 个位置元素,若成功则返回 true,并将被删除的元素用引用变量e返回,否则返回 false 。
bool ListDlelete(SqList &L, int i, ElemType &e){
//本算法实现删除顺序表L中第i个位置的元素if(i < 1||i > L.length) //判断i的范围是否有效return false;e = L.data[i-1]; //将被删除的元素赋值给efor(int j = i; j < L.length; j++) //将第i个位置后的元素前移L.data[j-1] = L.data[j];L.length--; //线性表的长度减1return true;
}
最好情况:删除表尾元素,时间复杂度为O(1).
最坏情况:删除表头元素,时间复杂度为O(n).
平均情况:假设是删除第i个位置上结点的概率,则在长度为 n 的线性表中删除一个结点时,所需的时间复杂度为 O(n).
(5) 按值查找(顺序查找)
在顺序表L中查找第一个元素值等于e的元素,并返回其次序。
int LocateElem(SqList L, ElemType e){
//本算法实现查找顺序表中值为e的元素,如果查找成功,返回元素位序,否则返回0int i;for(i = 0; i<L.length; i++)if(e == L.data[i])return i+1; //下标为i的元素值等于e,返回其位序i+1return 0;
}
最好情况:查找的元素在表头,时间复杂度为O(1).
最坏情况:查找的元素在表尾,时间复杂度为O(n).
平均情况:假设是查找的元素在第 1 <= i <= L.length 个位置上的概率,则在长度为 n 的线性表中查找值为e的元素所需比较的平均次数为(n+1)/2
因此,线性表查找算法的时间复杂度为 O(n).
顺序表的基本操作实现相关推荐
- C++:顺序表的基本操作(待完善)
根据命令提示进行顺序表的基本操作(待完善) #include<iostream> #include<algorithm> using namespace std; #defin ...
- PTA 顺序表的基本操作
原题有50分,这个答案有45分,欢迎指出不足 ;) 6-2 顺序表基本操作 (50 分) 实现顺序表的基本操作,如初始化.插入.删除.输出等. 注意:顺序表中可有重复元素值. 要求:写出三个基本操作函 ...
- 【头歌】顺序表的基本操作
第1关:顺序表的插入操作 任务描述 本关任务:编写顺序表的初始化.插入.遍历三个基本操作函数. 相关知识 顺序表的存储结构 顺序表的存储结构可以借助于高级程序设计语言中的数组来表示,一维数组的下标与元 ...
- 编程实现顺序表的基本操作
void InitList(SqList &L)//建立空顺序表函数 voidListInsert(SqList &L, int i, ElemType e) //在顺序表中第i个位置 ...
- 顺序表的基本操作(详细、全面)
顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数据元素 ...
- 线性表之顺序表的基本操作
线性表的定义 线性表是具有相同数据类型的 n ( n > = 0 ) n(n>= 0) n(n>=0)个数据元素的有限序列,其中 n n n为表长,当 n = 0 n=0 n=0时线 ...
- 线性表-顺序表的基本操作
线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...
- 简单认识顺序表的基本操作
文章目录 顺序表 1. 顺序表的概念 2. 顺序表的基本操作 2.1 顺序表的基本属性 2.2 增加元素操作 2.2.1 头插 2.2.2 尾插 2.2.3 按位置插入元素 2.3 删除元素操作 2. ...
- 顺序表的基本操作 SCAU8576、SCAU8577、SCAU8578
//此项目功能:完成顺序表的基本操作及OJ给出的三道题:8576.8577.8578 #include <stdio.h> #include <malloc.h> #defin ...
- Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作
Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...
最新文章
- 无线传感器网络--分簇或者不分簇
- python中的self描述符__set__和__get__简单总结
- 面向对象代码_面向对象的代码生成方法
- 心电图 python_ST段凹面型向上抬高,一定是早期复极?心电图读图第201期
- 无线路由器建立usb共享打印服务器,无线路由器USB网络共享管理设置方法
- Excel加载“宏”
- 最强MySQL笔记(超详细版)(一)
- 联想裁员与全球化背景下的知识阶层失业
- (思科模拟器)三层交换机dhcp动态获取,ping通不同vlan ,连通外网
- Windows下强制删除文件或文件夹
- mysql 备份 access_备份access数据库
- 二分法查找——绝对值最小的数
- c语言 L1-009 N个数求和 (20分)
- 菜鸟保税仓成全球商家进中国首选 秒级通关领先全球
- QQ会员首页HTML+CSS
- 微信小程序之发送表情和文字和语音之php
- 最通俗易懂的JavaScript进阶教程
- 客户数据平台(CDP)是什么?
- 关于android中的.9图(一)——如何画.9图
- 在所有数据库的所有数据中搜索关键字
热门文章
- Axure 注册码(亲测可用)
- 高性能初级维修电工及技能考核实训装置
- three.js入门——写个小车
- LiveQing视频点播RTMP直播服务一步一步搭建视频直播RTMP推流流媒体服务
- 生信技能树linux虚拟机,【生信技能树】Linux练习
- SpringBoot 拦截器和过滤器区别及应用
- c语言中除法取整6,关于C语言的除法与取整问题!?
- windows7下预览psd
- Linux上的视频播放及MPV播放器与SVP4插帧
- 看不出svp补帧_SVP4免费版|SVP4(视频补帧软件)下载v4.2.0.122免费版 附教程 - 欧普软件下载...