一、类定义
顺序表类的定义如下:
#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++实现)的更多相关文章
-
[C++]数据结构:线性表之顺序表
1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...
-
C#线性表之顺序表
线性表是最简单.最基本.最常用的数据结构.线性表是线性结构的抽象(Abstract), 线性结构的特点是结构中的数据元素之间存在一对一的线性关系. 这种一对一的关系指的是数据元素之间的位置关系,即: ...
-
数据结构Java实现02----线性表与顺序表
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
-
数据结构Java实现01----线性表与顺序表
一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...
-
[C++]线性链表之顺序表<;一>;
顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...
-
c/c++ 线性表之顺序表
线性表之顺序表 存储在连续的内存空间,和数组一样. 下面的代码,最开始定义了一个能存8个元素的顺序表,当超过8个元素的时候,会再追加开辟空间(函数:reInit). 实现了以下功能: 函数 功能描述 ...
-
[C++]线性链表之顺序表<;二>;
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
-
线性表之顺序表C++实现
线性表之顺序表 一.头文件:SeqList.h //顺序线性表的头文件 #include<iostream> ; //定义顺序表SeqList的模板类 template<class ...
-
【PHP数据结构】线性表?顺序表?链表?别再傻傻分不清楚
遵从所有教材以及各类数据结构相关的书书籍,我们先从线性表开始入门.今天这篇文章更偏概念,是关于有线性表的一个知识点的汇总. 上文说过,物理结构是用于确定数据以何种方式存储的.其他的数据结构(树.图). ...
随机推荐
-
PYTHON学习之路_PYTHON基础(2)
学习内容: 1.Python数据类型与变量 2.Python字符串 3.Python列表 4.Python while循环 5.Python字典 6.Python实例 一.Python数据类型与变量 ...
-
DDD开发框架ABP之本地化/多语言支持
本地化(Localization)也就是多语言功能,借此用户能够选择他的母语或熟悉的语言来使用系统,这显然非常有利于软件系统推向国际化.一个应用程序的UI界面至少有一种语言,DDD开发框架ABP就提供 ...
-
让shell脚本在后台飞
1. 使用&符号在后台执行命令 你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:. $ ./my-shell-script.sh & 2. 使用 ...
-
ASP.NET MVC 监控诊断、本地化和缓存
这篇博客主要是针对asp.net mvc项目的一些常用的东东做一个讲解,他们分别是监控诊断.本地化和缓存.虽然前两者跟asp.net mvc看上去好像是没什么关联. 但其实如果真正需要做asp.net ...
-
android架构图示
Android系统架构和一些普遍的操作系统差不多,都是采用了分层的架构,从他们之间的架构图看,Android系统架构分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核 ...
-
boost总结之any
boost中any库相对variant简单,any可以不限定类型,variant中对我们事先会定义好我们所需的类型,但是any无此限制,any的类型检测是在run time时. boost::an ...
-
通过ComponentName获取相应的Widget
最近在锁屏上研究,如果预置widget,研究了好久,终于找到方法了,先上代码: private int getAppWidgetFromComName(ComponentName providerCo ...
-
GitHub 1W star 成就达成!
起因 感谢各位大佬的支持收获了人生第一个(很有可能也是唯一一个)1W star 项目. 从今年一月份创建项目至今 8 个月时间. 一共关闭了 27 个 issue,47 个 RP,总共有 11 位小伙 ...
-
C语言小程序:除去字符串中间不需要的字符(从小引发大思考)
#include <stdio.h>#include <conio.h> void fun(char *a, char *h, char *p){ char b[81]; ch ...
-
android发送与接收超长短信
android发送与接收超长短信 android接收发送短信,支持的最大字符数是70个,实际是67个字符,如果发送的短信超过了该数目,那就需要用到sendMultipartTextMessage()方 ...