数据结构_SeqList顺序表(C++实现

文章目录

  • 数据结构_SeqList顺序表(C++实现
    • 前言&注意事项
    • 顺序表实现方法
    • 总结
    • 结束

前言&注意事项

  1. 有些函数没有修改成员数据的要求,防止成员函数被修改,将只有读取要求的函数设为常函数(只读函数
  2. 用 C++实现,有很多优势,其中一个就是对象可以直接访问并修改数据成员,不用再想要修改的时候再传地址什么的
  3. 其他注意事项在代码注释以及code日记中体现

顺序表实现方法

seqList.h

#include<iostream>
#include<cassert>class outofsize{};//专门作为异常信息的类(用于异常处理抛出);非法访问
class nullList{};//链表为空
class nullPointer{};//空指针using namespace std;template<class slDataType>
class seqList
{
private:slDataType* elem;//用数组实现顺序表int size;//顺序表实际大小int capacity;//顺序表容量(能存储的除了哨兵位的头结点之外的实际有效数据的个数void doubleCapacity();//扩容函数;不过这里没必要单独写出来,只有在添加数据的时候有可能会调用到,其他时候不会用到,所以不会产生函数的复用,不用单独构建这个函数,直接包含在添加数据的函数里面就行
public:seqList(int Size = 10);//初始化顺序表bool seqListEmpty()const;//判空,空则返回真,否则返回假bool seqListFull()const;//判满void seqListPushHead(slDataType x);//头插void seqListPushBack(slDataType x);//尾插void seqListPopHead();//头删void seqListPopBack();//尾删void seqListInsert(int pos , slDataType &data);//在任意位置pos插入;此处对元素数据运用了引用,不用再构建形参局部变量,可以减少一点空间开辟,不过个人感觉没有也无伤大雅void seqListErase(int pos);//删除pos的元素void seqListRemove(int pos, slDataType &e);//删除pos处的元素,并赋值给e(这里才体现引用的用处slDataType seqListGet(int pos)const;//返回pos处的元素int seqListFind(slDataType& data)const;//返回值等于data的元素的位置,没有则返回0int seqListLength()const;//返回顺序表长度void seqListDestory();//清除顺序表,使其成为空表~seqList();//析构函数
};

seqList.cpp

#include"seqList.h"template<class slDataType>
seqList<slDataType>::seqList(int Size)//初始化顺序表
{this->elem = new slDataType[Size];//开辟动态数组if (!elem)throw nullPointer();this->size = 0;this->capacity = Size-1;//保留第一个元素作为哨兵位的头结点(不过个人认为在顺序表这里没有必要,链表那里才能体现出哨兵位头结点的好处)
} template<class slDataType>
void seqList<slDataType>::doubleCapacity()//扩容函数
{assert(elem);//感觉判空的时候不如直接用assert,因为为了判空就用异常处理有些大材小用,而且只在判空的时候用assert,这样就直到程序一中断就说明是空指针//所以关于指针可能为空的情况,我在除了这个函数之外的地方都用的assert,这个用异常处理结构太麻烦了,直接暴力检查就okslDataType* newElem = new slDataType[capacity * 2];if (!newElem)throw nullPointer();for (int i = 1;i < size; i++){newElem[i] = elem[i];}delete []elem;elem = newElem;capacity = capacity * 2 - 1;//第一个结点要留给哨兵位,capacity是实际能存储的有效数据的个数//到了这里,感觉写顺序表用哨兵位的头结点真的是,麻烦又没有必要
}template<class slDataType>
bool seqList<slDataType>::seqListEmpty()const//判空,空则返回真,否则返回假
{assert(elem);return size == 0;
}template<class slDataType>
bool seqList<slDataType>::seqListFull()const//判满
{assert(elem);return size == capacity;
}template<class slDataType>
void seqList<slDataType>::seqListPushHead(slDataType x)//头插
{assert(elem);if (size == capacity)doubleCapacity();//顺序表满了就扩容for (int i = size + 1; i > 1; i --){elem[i] = elem[i - 1];}elem[1] = x;size++;
}template<class slDataType>
void seqList<slDataType>::seqListPushBack(slDataType x)//尾插
{assert(elem);if (size == capacity)doubleCapacity();size++;elem[size] = x;
}template<class slDataType>
void seqList<slDataType>::seqListPopHead()//头删
{assert(elem);if (size != 0){for (int i = 1; i < size; i++)elem[i] = elem[i + 1];size--;}else{throw nullList();}
}template<class slDataType>
void seqList<slDataType>::seqListPopBack()//尾删
{assert(elem);if (size != 0){size--;}else{throw nullList();}
}template<class slDataType>
void seqList<slDataType>::seqListInsert(int pos, slDataType& data)//在任意位置pos插入
{assert(elem);if (pos > size + 1 || pos < 1)         //pos=1的时候是头插,=size+1的时候是尾插throw outofsize();if (size == capacity)doubleCapacity();for (int i = size + 1; i > pos; i--){elem[i] = elem[i - 1];}elem[pos] = data;size++;
}template<class slDataType>
void seqList<slDataType>::seqListErase(int pos)//删除pos的元素
{assert(elem);if (pos > size + 1 || pos < 1)         //pos=1的时候是头删,=size+1的时候是尾删throw outofsize();if (size != 0 ){for (int i = pos; i < size; i++)elem[i] = elem[i + 1];size--;}else{throw nullList();}
}template<class slDataType>
void seqList<slDataType>::seqListRemove(int pos, slDataType& e)//删除pos处的元素,并赋值给e(这里才体现引用的用处
{assert(elem);if (pos > size + 1 || pos < 1)         throw outofsize();e = elem[pos];seqListErase(pos);
}template<class slDataType>
slDataType seqList<slDataType>::seqListGet(int pos)const//返回pos处的元素
{assert(elem);if (pos > size + 1 || pos < 1)         throw outofsize();return elem[pos];
}template<class slDataType>
int seqList<slDataType>::seqListFind(slDataType& data)const//返回值等于data的元素的位置,没有则返回0(这里采用了一个比较有意思的方式
{assert(elem);int i;elem[0] = data;                        //将需要查找的值赋给哨兵位头结点,哨兵位头结点中的数据不属于顺序表中的数据for (i = size; i >= 0; i--)       //这样的话只需要遍历一遍就好了,没找到的话就会遍历到底,i就直接等于0,比较巧妙if (elem[i] == data)break;return i;
}template<class slDataType>
int seqList<slDataType>::seqListLength()const//返回顺序表长度
{assert(elem);return size;
}template<class slDataType>
void seqList<slDataType>::seqListDestory()//清除顺序表,使其成为空表
{assert(elem);delete[]elem;elem = NULL;size = 0;capacity = 0;
}

总结

结束

That’s all, thanks for reading!

数据结构_顺序表SeqList(C++相关推荐

  1. python 数据库表结构转为类_顺序表数据结构在python中的应用

    数据结构不仅仅指的数据值在逻辑上的结构,更有在存储空间上的位置结构,顺序表,故名思意是有一定顺序的数据结构.顺序表最基本模型如图: 对于基本布局顺序表而言,它存储相同单元大小并且在内存地址上连续的数据 ...

  2. 数据结构-顺序表(SeqList)

    顺序表 SeqList C实现 C++实现 结构代表数据和数据之间的关系 1.同属一个集合 不允许元素重复 2.线性关系 一对一的关系 除了第一个之外 没有直接前驱最后一个没有直接后继 中间节点都有唯 ...

  3. Tsai笔记:C++学习随性笔记(2)—— 数据结构:顺序表的基本操作

    Tsai笔记:C++学习随性笔记(2)-- 数据结构:顺序表的基本操作 Tsai三步.(第一步,功能说明.第二步,结果图显示.第三步,代码展示) 第一步,功能说明. 1.线性表的顺序存储 线性表的顺序 ...

  4. 【数据结构】顺序表的应用(4)(C语言)

    [数据结构]顺序表的应用(1)(C语言) [数据结构]顺序表的应用(2)(C语言) [数据结构]顺序表的应用(3)(C语言) 设计一个算法,将一个顺序表倒置,即如果顺序表各个节点值存储在一维数组a中, ...

  5. 【数据结构】顺序表的应用(3)(C语言)

    问题: 已知一个顺序表中的各节点值是从大到小有序的,设计一个算法,插入一个值为x的节点,使顺序表中的节点仍然是从小到大有序的. 头文件与该头文件一样:[数据结构]顺序表的实现(C语言) #includ ...

  6. 【数据结构】顺序表的应用(2)(C语言)

    问题: 2.有顺序表A和B,其元素均按从小到大的升序排列,编写一个算法,将它们合并成一个顺序表C,要求C的元素也按从小到大的升序排列. 头文件与该头文件一样:[数据结构]顺序表的实现(C语言) #in ...

  7. 【数据结构】顺序表的应用(1)(C语言)

    问题: 1.将顺序表(a1,a2,-,an)重新排列以a1为界的两部分:a1前面的值均比a1小,a1后面的值均比a1大(这里假设数据元素的类型具有可比性,不妨设为整型). 头文件与该头文件一样:[数据 ...

  8. java设计一个顺序表类的成员函数_顺序表代码讲解以及实现

    用C语言编写一个有关顺序表的程序代码 创建一个顺序表,其数据元素类型为整型: 在该顺序表中插入数据(#include #include #define MaxSize 50 typedef char ...

  9. 数据结构之顺序表(二)

    这是接着之前的剩下来的部分: #include <stdlib.h> #include "SeqList.h" #include <stdio.h>SeqL ...

最新文章

  1. DNS隧道工具dns2tcp
  2. 利用PowerDesigner比较2个数据库
  3. zabbix服务无法启动
  4. matlab调用c++生成dll32位与64位对应关系
  5. 2 了解MyBatis配置文件
  6. 面向对象——三层架构(表现层、业务层、持久层)
  7. 两个sql交集_sql的高级命令运用
  8. 【转】贝塞尔曲线介绍
  9. Redis入门(三)Redis的基本数据类型
  10. html5单击修改背景色,用获取节点的方式实现点击按钮改变标签背景颜色的问题...
  11. 北京科技大学计算机作业,北京科技大学计算机题
  12. 查询:使用多表连接查询数据
  13. [APIO2009]抢掠计划
  14. Linux自动注销登录的帐户
  15. ubuntu服务器修改保存文件,Ubuntu Server 如何永久保存iptables的设置?
  16. ios设置中性黑体_iOS 使用自定义字体 - 苹方字体
  17. 智能化系统之门禁系统
  18. Python视频制作 MoviePy框架音频处理模块
  19. 10年攒一百万回老家一个月6千利息,现实么
  20. bootstrap table合并单元格

热门文章

  1. 钢丝捻线机行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  2. 微软研究团队成员自曝删改不利数据,量子计算重大进展是假的
  3. 机器学习模型评估的方法总结(回归、分类模型的评估)
  4. 从上海医保聊一聊大公司的一种病
  5. 直播技术总结(五)如何快速起播直播流
  6. ExcelVBA之传递参数给一子程序以及如何将值从子程序传递回给主调过程
  7. 手机端移动端qq在线聊天代码
  8. Joomla教程:创建Joomla语言包安装插件 【转】
  9. 7个月我 自学Java 找到啦一份9k的工作,分享经历
  10. 计算机毕业设计(附源码)python-在线作业管理系统