一、类定义

顺序表类的定义如下:

#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. ASP.NET 内容管理系统CMS

    一.Umbraco 项目地址: http://umbraco.org/ Umbraco是一个开放源码的CMS内容管理系统,基于asp.net建立,使用mssql进行存储数据. 使用Umbraco ,设 ...

  2. param动作

    param动作通常与forword一起使用 <jsp:forword page="目标页面" > <jsp:param value="参数值" ...

  3. 学习:窗口创建以及消息处理basic.c

    WNDCLASS结构: Windows 的窗口总是基于窗口类来创建的,窗口类同时确定了处理窗口消息的窗口过程(回调函数). 在创建应用程序窗口之前,必须调用 RegisterClass 函数来注册窗口 ...

  4. docker 服务无法启动

    重装以后仍然不行,dockerd可以运行,但是systemctl start docker.service不行,后来在编辑一个文件时,提示没有空间可以保存,结果一查,发现服务器空间基本占满了, 通过 ...

  5. linux学习12 bash的常见特性及文本查看命令实战

    一.回顾 1.FHS,命令及bash命令历史 a.FHS: /bin,/sbin,/lib,/lib64,/etc /home,/root /boot /media,/mnt /proc,/sys / ...

  6. 简单JSON

    JSON是什么 JavaScript Object Notation(JavaScript 对象表示),是一种存储和交换文本信息的语法,它独立程序语言,是轻量级的文本数据交换格式,比XML更小.更快, ...

  7. pg_flame postgresql EXPLAIN ANALYZE 火焰图工具

    pg_flame 是golang 编写的一个将pg的EXPLAIN ANALYZE 转换为火焰图,使用简单 以下是一个简单的demo 环境准备 docker-compose 文件   version: ...

  8. 使用overnightjs typescript 注解开发expressjs 应用

    overnightjs 提供了基于注解的expressjs应用开发,包含了比较全的express 开发支持,使用简单,以下是一个简单的试用 项目准备 项目使用pkg 进行了打包处理 初始化 yarn ...

  9. nginx之http反向代理多台服务器

    Nginx http 反向代理高级应用 是Nginx可以基于ngx_http_upstream_module模块提供服务器分组转发.权重分配.状态监测.调度算法等高级功能. http upstream ...

  10. Linux 查看文件权限命令ls -l 输出信息每列所代表的含义