数据结构 - 顺序表 C++ 实现
顺序表
此处实现的顺序表为**第一个位置为 data[0] **的顺序表
顺序表的定义为
const int MAX = 50;
typedef int ElemType;
typedef struct {
ElemType data[MAX];
int length;
} SeqList; //data[0] 为第一个元素
顺序表元素的插入
在顺序表 L 位置 i 处插入元素 e
需要注意的几个点:
- 插入元素,插入位置范围为 1 ~ length + 1,否则不合法;
- 移动时的
for的首尾元素的分析- 此处为 data[0] 开始的顺序表,因此第 j 个元素位置在 data[j - 1]
- 第一次移动将第 L.length 个元素移动到第 L.length + 1 处,代码为 L.data[L.length] = L.data[L.length - 1];
- 最后一次移动将第 i 个元素移动到下一个位置,代码为 L.data[i] = L.data[i - 1];
- L.data[j + 1] = L.data[j]: for 起始为 j = L.length - 1 最后为 j = i - 1;
- L.data[j] = L.data[j - 1]: for 起始为 j = L.length 最后为 j = i;
代码如下:
bool ListInsert(SeqList &L, int i, ElemType e) {
if(i < 1 || i > L.length + 1) {
return false;
}
if(L.length == MAX) {
return false;
}
// 1.
for(int j = L.length - 1; j >= i - 1; j--) {
L.data[j + 1] = L.data[j];
}
// 2.
for(int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
顺序表元素的删除
删除顺序表 L 位置 i 处的元素,将删除元素放在 x 中
需要注意的几个点:
删除元素,删除位置范围为 1 ~ length,否则不合法;
移动时的
for的首尾元素的分析此处为 data[0] 开始的顺序表,因此第 j 个元素位置在 data[j - 1]
第一次移动将第 i + 1 个(data[i])元素移动到第 i 处(data[i - 1]),代码为
L.data[i - 1] = L.data[i];
最后一次移动将第 L.length 个(data[L.length-1])元素移动到第 L.length - 1 处,
代码为 L.data[L.length - 2] = L.data[L.length - 1];
L.data[j + 1] = L.data[j]: for 起始为 j = i 最后为 j = L.lenght - 1;
L.data[j] = L.data[j - 1]: for 起始为 j = i - 1 最后为 j = L.length - 2;
代码如下:
bool ListDelete(SeqList &L, int i, ElemType &e) {
if(i < 1 || i > L.length) {
return false;
}
e = L.data[i - 1];
for(int j = i - 1; j < L.length - 1; j++) {
L.data[j] = L.data[j + 1];
}
for(int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
顺序表的查找
按值查找返回位置
顺序查找所有顺序表中的值,若找到则返回位置(第一个位置为 data[0]),若未找到返回 0
int LocateElem(SqList L, ElemType e) {
for(int i = 0; i < L.length; i++) {
if(L.data[i] == e) {
return i + 1;
}
}
return 0;
}
按位置查找
对于顺序表可以随机存储,直接取数即可;
ElemType GetByLocate(SqList L,int i) {
return L.data[i];
}
顺序表的测试
#include<iostream>
using namespace std;
//静态分配空间
const int MAX = 50;
typedef int ElemType;
typedef struct {
ElemType data[MAX];
int length;
} SqList; //data[0] 为第一个元素
/*
//动态分配空间
typedef struct {
ElemType *data;
int MAX, length;
};
*/
void ListInitite(SqList &L) {
L.length = 0;
}
//插入元素,插入位置范围为 1 ~ length + 1
bool ListInsert(SqList &L, int i, ElemType e) {
if(i < 1 || i > L.length + 1) {
return false;
}
if(L.length == MAX) {
return false;
}
// for(int j = L.length - 1; j >= i - 1; j--) {
// L.data[j + 1] = L.data[j];
// }
for(int j = L.length; j >= i; j--) {
L.data[j] = L.data[j - 1];
}
L.data[i - 1] = e;
L.length++;
return true;
}
bool ListDelete(SqList &L, int i, ElemType &e) {
if(i < 1 || i > L.length) {
return false;
}
e = L.data[i - 1];
// for(int j = i - 1; j < L.length - 1; j++) {
// L.data[j] = L.data[j + 1];
// }
for(int j = i; j < L.length; j++) {
L.data[j - 1] = L.data[j];
}
L.length--;
return true;
}
int LocateElem(SqList L, ElemType e) {
for(int i = 0; i < L.length; i++) {
if(L.data[i] == e) {
return i + 1;
}
}
return 0;
}
ElemType GetByLocate(SqList L,int i) {
return L.data[i - 1];
}
int main() {
SqList L;
ListInitite(L);
for(int i = 1; i <= 10; i++) {
if(ListInsert(L, i, 3 * i)) {
printf("插入成功\n");
}
}
cout << L.data[0] << endl;
for(int i = 1; i <= L.length; i++) {
ElemType k = GetByLocate(L, i);
printf("%d ", k);
}
printf("\n元素 9 在顺序表中的位置为:%d\n", LocateElem(L, 9));
ElemType e;
ListDelete(L, 8, e); //删除第 8 个元素
printf("被删除的元素为%d\n", e);
printf("删除后\n");
for(int i = 1; i <= L.length; i++) {
ElemType k = GetByLocate(L, i);
printf("%d ", k);
}
return 0;
}
测试数据及结果如下
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
插入成功
3
3 6 9 12 15 18 21 24 27 30
元素 9 在顺序表中的位置为:3
被删除的元素为24
删除后
3 6 9 12 15 18 21 27 30
数据结构 - 顺序表 C++ 实现的更多相关文章
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- hrbust-1545-基础数据结构——顺序表(2)
http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- 数据结构顺序表删除所有特定元素x
顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...
- 数据结构---顺序表(C++)
顺序表 是用一段地址连续的存储单元依次存储线性表的数据元素. 通常用一维数组来实现 基本操作: 初始化 销毁 求长 按位查找 按值查找 插入元素 删除位置i的元素 判空操作 遍历操作 示例代码: // ...
- 数据结构顺序表Java实现
Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...
- python算法与数据结构-顺序表(37)
1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...
- 数据结构——顺序表(sequence list)
/* sequenceList.c */ /* 顺序表 */ /* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表. */ #in ...
- 数据结构顺序表中Sqlist *L,&L,Sqlist *&L
//定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...
- Java数据结构——顺序表
一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...
随机推荐
- c++ struct enum union加typedef与不加typedef
struct/enum/union加typedef与不加typedef 匿名结构体 struct { int a; int b; } v; // 这里表示定义了一个结构体的变量v,且结构体类型没有名字 ...
- WebGL 与 WebGPU比对[5] - 渲染计算的过程
目录 1. WebGL 1.1. 使用 WebGLProgram 表示一个计算过程 1.2. WebGL 没有通道 API 2. WebGPU 2.1. 使用 Pipeline 组装管线中各个阶段 2 ...
- Java课程设计---修改学生基本信息
1.修改窗体 2.在StudentDao中增加修改学生信息的方法 /** * 修改的方法 * * @param student * @return * @throws SQLException */ ...
- MapReduce中一次reduce方法的调用中key的值不断变化
简单一句话总结就是:ReduceContextImpl类的RawKeyValueIterator input迭代器对象里面存储中着key-value对的元素, 以及一个只存储value的迭代器,然后每 ...
- 设置vim永久显示编号
永久显示行号,需要我们设置配置文件,两种配置方式: 1. /etc/vimrc 是系统范围的初始化配置 2. -/.vimrc 个人的vim初始化配置 编辑配置文件,以个人为例: vi ...
- 基于SqlSugar的数据库访问处理的封装,支持多数据库并使之适应于实际业务开发中
在我的各种开发框架中,数据访问有的基于微软企业库,有的基于EFCore的实体框架,两者各有其应用场景,不过多的去比较.最近在使用SqlSugar的时候,觉得这个数据访问处理的组件确实很灵活,据说性能也 ...
- Lua中如何实现类似gdb的断点调试—06断点行号检查与自动修正
前面两篇我们对性能做了一个优化,接下来继续来丰富调试器的特性. 我们前面提到过,函数内并不是所有行都是有效行,空行和注释行就不是有效行.我们之前在添加断点的时候,并没有对行号进行检查,任何行号都能成功 ...
- 微信小程序+laravel 7+ Redis +短信宝 实现手机号验证码登录
以下代码可以进行优化和封装:这里我实现功能为主,就不封装啦.小伙伴可以自己试着封装一下. 1:书写登录表单 <view class="container"> <v ...
- docker学习(三) - docker理解及命令
Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository) 镜像 Docker 镜像就是一个只读的模板. 例如:一个镜像可以包含一个完整的 ubunt ...
- CF437C题解
思路很妙/youl 题目大意见翻译,说得很清楚/youl 首先,这个图到最后所有点都会被删除,所以所有边都会被删除. 但是考虑点的贡献会很麻烦,所以在这里我们考虑边的贡献. 边的贡献就是,左端点和右端 ...