一、类定义

顺序表类的定义如下:

#ifndef SEQLIST_H
#define SEQLIST_H typedef int ElemType; /* "ElemType类型根据实际情况而定, 这里假设为int */ class SeqList
{
public:
SeqList(int size = 0); // 构造函数
~SeqList(); // 析构函数 bool isEmpty(); // 判断是否为空操作
int getLength(); // 获取顺序表长度操作
void clearList(); // 清空顺序表操作
bool getElem(int i, ElemType *e); // 获取元素操作
int locateElem(const ElemType e); // 查找元素位置操作
bool appendList(const ElemType e); // 附加元素操作
bool insertList(int i, const ElemType e); // 插入元素操作
bool deleteList(int i, ElemType *e); // 删除元素操作
void traverseList(); // 遍历顺序表 private:
ElemType *m_pDataArr; // 指向存放顺序表元素的数组
int m_length; // 顺序表的当前长度
int m_maxSize; // 顺序表的最大容量
}; #endif

二、构造函数

传入用户指定的容量参数赋值给 m_maxSize,声明指针 m_pDataArr 指向 ElemType 数组,m_length 置0。

// 构造函数
SeqList::SeqList(int size)
{
// 初始化顺序表的最大容量
m_maxSize = size;
// 初始化存放顺序表元素的数组
m_pDataArr = new ElemType[m_maxSize];
// 初始化顺序表的当前长度
m_length = 0;
}

三、析构函数

在析构函数中释放顺序表指针申请的内存空间,并指向 NULL 避免成为野指针。

// 析构函数
SeqList::~SeqList()
{
delete[] m_pDataArr;
m_pDataArr = NULL;
}

四、判空和获取顺序表长度操作

m_length等于 0 则表示顺序表未空;返回 m_length 获取长度。

// 判断是否为空操作
bool SeqList::isEmpty()
{
return m_length == 0 ? true : false;
} // 获取顺序表长度操作
int SeqList::getLength()
{
return m_length;
}

五、获取元素操作

先判断顺序表是否存在,且 i 是否在合理范围内;然后再将 m_pDataArr[i] 的值赋值给元素 e

// 获取元素操作
bool SeqList::getElem(int i, ElemType *e)
{
// 前提条件: 顺序表已存在,且i在合理范围内:0 <= i <= m_length
if (m_length == 0 || i < 0 || i > m_length) // 若m_length==0,则说明顺序表不存在
return false; *e = m_pDataArr[i]; return true;
}

六、附加元素操作

附加元素即是在表尾后面添加元素。

// 附加元素操作
bool SeqList::appendList(const ElemType e)
{
// 判断顺序表长度是否大于等于数组长度,是则抛出异常或动态增加容量
if (m_length >= m_maxSize)
return false; // 在表尾后面添加元素e
m_pDataArr[m_length] = e; // 表长加1
m_length++; return true;
}

七、插入元素操作

注意插入位置后的所有元素都要向后移动一个位置,但是在表尾下一个位置插入的这种情况,不用后移;另外允许 i 在表尾下一个位置插入。

// 插入元素操作
bool SeqList::insertList(int i, const ElemType e)
{
// 判断顺序表是否未满 且 i是否在合法范围内
if (m_length >= m_maxSize || i<0 || i>m_length) // 允许i在表尾下一个位置插入
return false; // 从最后一个元素开始向前遍历到第i个位置,分别将它们都向后移动一个位置
if (i <= m_length - 1) // 在表尾下一个位置插入的这种情况,不用后移
{
for (int k = m_length - 1; k >= i; k--)
{
m_pDataArr[k + 1] = m_pDataArr[k];
}
} // 将要插入元素填入位置i处
m_pDataArr[i] = e;
// 表长+1
m_length++; return true;
}

八、删除元素操作

注意若删除位置在表尾,则不需要前移。

// 删除元素操作
bool SeqList::deleteList(int i, ElemType *e)
{
// 判断顺序表是否未满 且 i是否在合法范围内
if (m_length == 0 || i<0 || i>m_length - 1)
return false; // 取出删除元素
*e = m_pDataArr[i]; // 从删除元素的下一个位置开始遍历到最后一个元素位置,分别将它们都向前移动一个位置
if (i != m_length - 1) // 【若删除位置在表尾,则不需要前移】
{
// 将删除元素的下一个位置及后面元素向前移动一位
for (int k = i; k < m_length - 1; k++)
m_pDataArr[k] = m_pDataArr[k + 1];
} // 表长减1
m_length--; return true;
}

九、遍历操作

遍历前需要判断顺序表是否存在,以及是否为空表

// 遍历顺序表
void SeqList::traverseList()
{
// 判断顺序表是否存在,以及是否为空表
if (m_pDataArr == NULL || m_length == 0)
return; for (int i = 0; i < m_length; i++)
{
cout << m_pDataArr[i] << " ";
}
cout << endl;
}

十、主函数执行

在主函数中执行的代码如下:

#include "stdafx.h"
#include <stdlib.h>
#include <iostream>
#include "seqListCpp.h" using namespace std; int main()
{
// 初始化顺序表
SeqList seqList(20); // 附加元素0-2到顺序表
cout << "附加元素0-2到顺序表!" << endl;
for (int i = 0; i<3; i++)
{
seqList.appendList(i);
}
cout << endl; // 在位置2插入元素到9顺序表
cout << "在位置2插入元素9到顺序表!" << endl << endl;
seqList.insertList(2, 9); // 在位置3删除元素
int value1;
if (seqList.deleteList(3, &value1) == false)
{
cout << "delete error!" << endl;
return -1;
}
else
{
cout << "在位置3删除元素,删除的元素为:" << value1 << endl << endl;
} // 查找元素位置
int index = seqList.locateElem(0);
if (index == -1)
{
cout << "locate error!" << endl;
return -1;
}
else
{
cout << "查找到元素0的位置为:" << index << endl << endl;
} // 遍历顺序表
cout << "遍历顺序表: ";
seqList.traverseList();
cout << endl; // 清空顺序表
cout << "清空顺序表!" << endl << endl;
seqList.clearList(); return 0;
}

输出结果如下图所示(编译器为VS2013):

[数据结构 - 第3章] 线性表之顺序表(C++实现)的更多相关文章

  1. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  2. C#线性表之顺序表

    线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...

  3. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  4. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  5. [C++]线性链表之顺序表<一>

    顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...

  6. c/c++ 线性表之顺序表

    线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...

  7. [C++]线性链表之顺序表<二>

    /*   @content 线性链表之顺序表   @date 2017-3-21 1:06   @author Johnny Zen  */ /* 线性表     顺序表     链式表[带头指针/不 ...

  8. 线性表之顺序表C++实现

    线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...

  9. 【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚

    遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门.今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总. 上文说过,物理结构是用于确定数据以何种方式存储的.其他的数据结构(树.图). ...

随机推荐

  1. 利用pil库处理图像

    1关于PIL PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了. 2PIL的主要功 ...

  2. spark读写Oracle、hive的艰辛之路(二)-Oracle的date类型

    近期又有需求为:导入Oracle的表到hive库中: 关于spark读取Oracle到hive有以下两点需要说明: 1.数据量较小时,可以直接使用spark.read.jdbc(orclUrl,tab ...

  3. ASP.NET Core Docker Nginx分权,多网站部署

    https://www.cnblogs.com/esofar/p/10694319.html

  4. Singer 修改tap-s3-csv 支持minio 连接

    singer 团队官方处了一个tap-s3-csv 的tap,对于没有使用aws 的人来说并不是很方便了,所以简单修改了 下源码,可以支持通用的s3 csv 文件的处理,同时发布到了官方pip 仓库中 ...

  5. netflix conductor 学习(一)docker-compose 运行

    为了方便学习以及使用netflix conductor 基于官方的dockerfile,构建了server 以及ui 的容器镜像并push dockerhub 环境准备 官方docker-compos ...

  6. There is insufficient memory for the Java Runtime Environment to continue.

    There is insufficient memory for the Java Runtime Environment to continue.

  7. Linux下的C++ socket编程实例

    阅读目录 基本的局域网聊天 客户端服务端双向异步聊天源码 局域网内服务端和有限个客户端聊天源码 完美异步聊天服务端和客户端源码 C++定时器 select异步代码 pthead多线程 服务端: 服务器 ...

  8. 洛谷 CF1153B Serval and Toy Bricks

    目录 题目 思路 \(Code\) 题目 CF1153B Serval and Toy Bricks 思路 自己也很懵的一道题(不知道自己怎么就对了)...只要对于所给的俯视图上值为\(1\)的位置输 ...

  9. hive基础知识一

    1. Hive是什么 1.1 hive的概念 Hive:由Facebook开源,用于解决海量(结构化日志)的数据统计. Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表 ...

  10. [linux][c++]linux c++ 通过xcb库获取屏幕大小

    linux c++ 通过xcb库获取屏幕大小 #include <stdio.h> #include <xcb/xcb.h> /** clang++ main.cpp -o m ...