当前位置: 首页 > news >正文

顺序表入门

目录

顺序存储定义

存储方式

和线性表的区别

插入与删除操作

GetElem(获得元素):时间复杂度O(1)

ListInsert(插入):时间复杂度O(N)

 ListDelete(删除):时间复杂度O(N)

优缺点

顺序存储定义

顺序存储结构是线性表的两种物理结构的一种。顺序存储结构在存储数据时用的是一段地址连续的存储单元,每个数据元素类型相同。

存储方式

所以,我们可以用一维数组来实现顺序存储结构。即把第一个元素存储在数组下标为0的位置上,接着将后面的元素依次存储在数组中。

代码

#define MAXSIZE 20//存储空间初始分配量
typedef int ElemType;//ElemType类型根据实际情况而定,这里设置为int
typedef struct {
	ElemType data[MAXSIZE];//数组
	int length;//线性表长度
}SqList;
#include<iostream>
#define MAXSIZE 10//定义最大长度
using namespace std;
typedef struct {
	int data[MAXSIZE];//数组存放存放数据元素
	int length;//顺序表当前长度
}SqList;//顺序表类型定义
void InitList(SqList& L) {
	for (int i = 0; i < MAXSIZE; i++) {
		L.data[i] = 0;//将所有元素设置为默认初始值
	}
	L.length = 0;//顺序表初始长度为0
}
int main() {
	SqList L;//声明顺序表
	InitList(L);//初始化顺序表
	return 0;
}

和线性表的区别

数组在存储分配之后长度不变(除了动态分配数组),线性表长度是线性表中元素的个数,所以线性表长度小于等于数组长度。

线性表下标是从1开始,数组下标是从0开始。

插入与删除操作

GetElem(获得元素):时间复杂度O(1)

获得第i个元素,将L中的第i-1下标的值返回

#define OK 1
#define ERROR 0
//Status是函数类型,其值是函数结果状态代码,如OK
typedef int Status;
//初始操作:顺序表L已存在,1<=i<=ListLength(L)
//操作结果:用e返回L中第i个数据元素的值,注意i是指位置,第1个位置的数组是从0开始
Status GetElem(SqList L, int i, ElemType* e) {
	if (L, length == 0 || i<1 || i>L, length)return ERROR;
	*e = L.data[i - 1];
	return OK;
}

真正返回的值是*e的值,函数返回值只是函数处理的状态

ListInsert(插入):时间复杂度O(N)

在第i个位置插入一个新元素,后面的元素都要后移一位。需要考虑数组长度,线性表长+1。

//初始条件:顺序表L已存在,1<=i<=ListLength(L)
//操作结果:在L中第i个位置之前插入新的数据元素e,L的长度+1
Status ListInsert(SqList* L, int i, ElemType e) {
	int k;
	//不符条件
	if (L->length == MAXSIZE)return ERROR;
	if (i<1 || i>L->length + 1)return ERROR;
	//若插入位置不在表尾,插入位置后的元素向后移一位
	if (i <= L->length) {
		for (k = L->length - 1; k >= i - 1; k--) {
			L->data[k + 1] = L->data[k];
		}
	}
	//插入新元素
	L->data[i - 1] = e;
	L->length++;
	return OK;
}
#include<iostream>
#define MAXSIZE 10
typedef struct {
	int data[MAXSIZE];
	int length;
}SqList;
bool ListInsert(SqList& L, int i, int e) {
	if (i<1 || i>L.length + 1)return false;
	if (L.length > MAXSIZE)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;
}
void InitList(SqList& L) {
	for (int i = 0; i < MAXSIZE; i++) {
		L.data[i] = 0;
	}
	L.length = 0;
}
int main() {
	SqList L;
	InitList(L);
	ListInsert(L, 3, 3);
	return 0;
}

 ListDelete(删除):时间复杂度O(N)

取出删除元素,从删除元素位置开始到最后,分别将它们向前平移一个位置,表长-1

//初始条件:顺序表L已存在,1<=i<=ListLength(L)
//操作结果:删除L的第i个数据元素,并用e返回其值,L的长度-1
Status ListDelete(SqList* L, int i, ElemType* e) {
	int k;
	if (L->length == 0)return ERROR;
	if (i<1 || i>L->length)return ERROR;
	*e = L->data[i - 1];
	if (i < L->length) {
		for (k = i; k < L->length; k++) {
			L->data[k - 1] = L->data[k];
		}
	}
	L->length--;
	return OK;
}
#include<iostream>
#define MAXSIZE 10
using namespace std;
typedef struct {
	int data[MAXSIZE];
	int length;
}SqList;
bool ListDelete(SqList& L, int i, int &e) {
	if (i<1 || i>L.length + 1) 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;
}
void InitList(SqList& L) {
	for (int i = 0; i < MAXSIZE; i++) {
		L.data[i] = 0;
	}
	L.length = 0;
}
int main() {
	SqList L;
	InitList(L);
	int e = -1;
	if (ListDelete(L, 3, e))cout << "已删除第3个元素,删除的值为" << e << endl;
	else cout << "位序i不合法,删除失败" << endl;
	return 0;
}

优缺点

优点:无需为表中元素之间的逻辑关系而增加额外的存储空间

可以快速地存取表中任一位置的元素

缺点:插入和删除需要移动大量元素

当线性表长度变化较大时,难以确定存储空间的容量

造成存储空间的“碎片”

相关文章:

  • Docker学习--容器操作相关命令--docker export 命令
  • 太速科技-330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡
  • vue-office 支持预览多种文件(docx、excel、pdf、pptx)预览的vue组件库
  • 《C++多线程下单例 “锁钥” 法则》
  • Fast-Poly-2024
  • GodWork 3D 7.24 GodWork AT 7.24天工三维实景三维建模软件
  • 技术与情感交织的一生 (四)
  • 树莓集团引领数字产业生态构建的新力量
  • 汇编学习之《指针寄存器大小端学习》
  • 题解:P8628 [蓝桥杯 2015 国 AC] 穿越雷区
  • [Lc5_dfs+floodfill] 岛屿的最大面积(传参) | 被围绕的区域 | 太平洋大西洋水流问题(双标记位传参)
  • # 基于OpenCV的图像拼接与文档检测:从特征提取到透视变换
  • 一致性hash应用-分库分表
  • github 页面超时解决方法
  • ai画图hiresfix放大算法。
  • 蓝桥杯每天5题
  • SQL注入:基于GET和POST的报错注入详解
  • 【含文档+PPT+源码】基于微信小程序的在线考试与选课教学辅助系统
  • RAG 优化 Embedding 模型或调整检索策略
  • VBA代码解决方案第二十三讲 EXCEL中,如何删除工作表中的空白行
  • 佛山知名网站建设公司/最近国际新闻大事20条
  • 厦门做公司网站/网络营销成功案例分析其成功原因
  • 网站仿站建设/发布外链的平台有哪些
  • 创意网站建设话术/怎么做推广赚钱
  • 网站建设和信息更新的通知/seo关键词选择及优化
  • 注册公司网站源码/百度搜首页