顺序表

此处实现的顺序表为**第一个位置为 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++ 实现的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. hrbust-1545-基础数据结构——顺序表(2)

    http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1545 基础数据结构——顺序表(2) ...

  3. c数据结构 顺序表和链表 相关操作

    编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...

  4. 数据结构顺序表删除所有特定元素x

    顺序表类定义: template<class T> class SeqList : { public: SeqList(int mSize); ~SeqList() { delete[] ...

  5. 数据结构---顺序表(C++)

    顺序表 是用一段地址连续的存储单元依次存储线性表的数据元素. 通常用一维数组来实现 基本操作: 初始化 销毁 求长 按位查找 按值查找 插入元素 删除位置i的元素 判空操作 遍历操作 示例代码: // ...

  6. 数据结构顺序表Java实现

    Java实现顺序表算法:1:首先我们需要定义我们的接口,关于顺序表的一些基本的操作:顺序表中的操作都有增删改查. //List接口 public interface IList { //返回线性表的大 ...

  7. python算法与数据结构-顺序表(37)

    1.顺序表介绍 顺序表是最简单的一种线性结构,逻辑上相邻的数据在计算机内的存储位置也是相邻的,可以快速定位第几个元素,中间不允许有空,所以插入.删除时需要移动大量元素.顺序表可以分配一段连续的存储空间 ...

  8. 数据结构——顺序表(sequence list)

    /* sequenceList.c */ /* 顺序表 */ /* 线性表的顺序存储是指在内存中用地址连续的一块存储空间顺序存放线性表中的各项数据元素,用这种存储形式的线性表称为顺序表. */ #in ...

  9. 数据结构顺序表中Sqlist *L,&L,Sqlist *&L

    //定义顺序表L的结构体 typedef struct { Elemtype data[MaxSize]: int length; }SqList; //建立顺序表 void CreateList(S ...

  10. Java数据结构——顺序表

    一个线性表是由n(n≥0)个数据元素所构成的有限序列. 线性表逻辑地表示为:(a0,a1,…,an-1).其中,n为线性表的长度,n=0时为空表.i为ai在线性表中的位序号. 存储结构:1.顺序存储, ...

随机推荐

  1. Thread.currentThread().getName() 和 this.getName()区别详解

    currentThread的详解 currentThread方法是Thread类的一个静态方法,用来获取当前运行的代码段,正在被哪个线程调用.我们先来看一眼源码. 是一个native方法.直接与系统层 ...

  2. 使用java程序完成大量文件目录拷贝工作

    java程序完成目录拷贝工作 背景描述:我目录有140多个,每个目录里面都有一个src目录.我现在想要所有的src目录移动到同一个目录中. package com.util.cp; import ja ...

  3. Python-Flask框架之"图书管理系统"项目,附详解源代码及页面效果截图

    该图书管理系统要实现的功能如下: 1. 可以通过添加窗口添加书籍或作者,如果要添加的作者和书籍已存在于书架上, 则给出相应的提示: 2. 如果要添加的作者存在,而要添加的书籍书架上没有,则将该书籍添加 ...

  4. JVM内存结构的组成、各部分功能作用

    一.程序计数器  作用:是记住下一条jvm指令的执行地址  特点: 是线程私有的 不会存在內存溢出 二.虚拟机栈 每个线程运行时所需要的内存,称为虚拟机栈 每个栈由多个栈帧(Frame) 组成,对应着 ...

  5. StringBuilder与String互转

    StringBuilder类是一个可变的字符序列. StringBuilder()           构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符.StringBuilder(Ch ...

  6. 由浅入深--第一个MyBatis程序

    话不多说,马上开始我们的第一个Mybatis程序: 第一个程序,当然要参考MyBatis的官网文档来搞,地址如下:https://mybatis.org/mybatis-3/zh/getting-st ...

  7. 使用kind快速搭建本地k8s集群

    Kind是什么? k8s集群的组成比较复杂,如果纯手工部署的话易出错且时间成本高.而本文介绍的Kind工具,能够快速的建立起可用的k8s集群,降低初学者的学习门槛. Kind是Kubernetes I ...

  8. 「BUAA OO Unit 1 HW1」面向测试小白的简易评测机

    「BUAA OO Unit 1 HW1」面向测试小白的简易评测机 声明:本评测机所使用数据生成来自郭鸿宇同学,这对本评测机非常重要 目录 「BUAA OO Unit 1 HW1」面向测试小白的简易评测 ...

  9. Qt:lambda表达式

    说明 c11之后加入了lambda表达式,所以Qt也支持 加载项 CONFIG += c++11 用法 [ capture ] ( parameters ) mutable -> return_ ...

  10. Linux安装Mysql8.0及SQL分类的补充

    Linux安装Mysql8.0 参考文章:https://blog.csdn.net/qq_38570633/article/details/109257430 参考文献:https://blog.c ...