一、类定义

顺序表类的定义如下:

#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. 【Redis】远程访问不了

    Windows安装后,启动的服务配置文件是redis.windows-service.conf "D:\Program Files\Redis\redis-server.exe" ...

  2. 命令查询windows&Linux系统版本信息

    Linux 查询系统名字输入"cat /proc/version",说明正在运行的内核版本uname -rwindows 查询系统名字win+r -> winversyste ...

  3. keil中error: #70: incomplete type is not allowed—解决方法

    今天在写程序的时候,想使用sizeof求数组的大小,数组中其他c文件定义,在头文件使用extern uint8_t buff_value[]; 声明 但是keil编译报错,网上查了,发现,需要写成ex ...

  4. java内部类的本质

    连接与通信,作为桥接中间件存在. 内部类和主体类可以无障碍通信: 1.通过继承连接实现: 2.通过接口连接通信: 形式: 1.命名空间: 2.运行上下文: 其它: 信息隐藏是次要功能. 内部类 Jav ...

  5. 异步模型:上下文与时间---async = request + reponse + handler + context + time;

    futureHandler = current(handler, context(t0)) : T0    ->    handler(context(t0),taskResult) : Tx ...

  6. 2018南京区域赛G题 Pyramid——找规律&&递推

    先手动推出前10项,再上BM板子求出递推式 $A_n = 5A_{n-1} - 10A_{n-2} + 10A_{n-3} - 5A_{n-4} + A_{n-5}$,根据特征根理论可求出特征方程 $ ...

  7. [React] Handle React Suspense Errors with an Error Boundary

    Error Boundaries are the way you handle errors with React, and Suspense embraces this completely. Le ...

  8. nave node 的虚拟环境管理工具

    nave 是类似python venv 的node 虚拟环境管理工具 安装 npm install -g nave 简单使用 帮助命令 Usage: nave <cmd> Commands ...

  9. Reactive Extensions (Rx) 入门(3) —— Rx的事件编程

    译文:https://blog.csdn.net/fangxing80/article/details/7628322 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  10. JavaScript兼容性问题 js兼容

    1.获取事件对象: var e=e||event; 2.阻止冒泡: e:stopPropagation?e:stopPropagation():e.cancelBubble=true; 3.阻止浏览器 ...