内容概要:

1.代码部分:

  • 线性表抽象类
  • 顺序表类
  • 单链表类
  • 双链表类
  • 主函数

2.基本概念及注意事项


代码(测试环境VS2017):

//线性表ADT类的定义:ADT_List.htemplate <typename E>class List
{
private:void operator=(const List&) {}List(const List&) {}
public:List() {}virtual ~List(){}virtual void clear() = 0;virtual void insert(const E&item) = 0;virtual void append(const E&item) = 0;virtual E remove() = 0;virtual void moveToStart() = 0;virtual void moveToEnd() = 0;virtual void prev() = 0;virtual void next() = 0;virtual int length() const = 0;virtual int currPos()const = 0;virtual void moveToPos(int pos) = 0;virtual const E& getValue()const = 0;
};
//顺序表类的实现:ADT_List.htemplate<typename E>
class AList :public List<E>
{
private:int maxSize;int listSize;int curr;E*listArry;
public:AList(int size = 100)//构造,默认大小为100{maxSize = size;listSize = curr = 0;listArry = new E[maxSize];}~AList() { delete[]listArry; }void clear(){delete[]listArry;listSize = curr = 0;listArry = new E[maxSize];}void insert(const E&it){assert(listSize < maxSize);for (int i = listSize; i > curr; i--)listArry[i] = listArry[i - 1];listArry[curr] = it;listSize++;}void append(const E&it){assert(listSize < maxSize);listArry[listSize++] = it;}E remove(){assert((curr >= 0) && (curr < listSize));E it = listArry[curr];for (int i = curr; i < listSize - 1; i++)listArry[i] = listArry[i - 1];listSize--;return it;}void moveToStart(){    curr = 0;}void moveToEnd() { curr = listSize; }void prev() { if (curr != 0)curr--; }void next() { if (curr < listSize)curr++; }int length() const { return listSize; }int currPos() const { return curr; }void moveToPos(int pos){assert((pos >= 0) && (pos < listSize));curr = pos;}const E& getValue () const{assert((curr >= 0) && (curr < listSize));return listArry[curr];}
};
//单链表类的实现:Single_List.htemplate<typename E>
class SLink
{
public:E element;SLink*next;//两个构造函数SLink(const E&elemval, SLink*nextval = NULL){element = elemval;next = nextval;}SLink(SLink*nextval = NULL) { next = nextval; }
};template<typename E>
class SList :public List<E>
{
private:SLink<E>*head;SLink<E>*tail;SLink<E>*curr;//为了操作方便,这里的curr指向当前元素的上一个元素int cnt;//链表节点数//初始化函数void init(){curr = head = tail = new SLink<E>;cnt = 0;}void removeall(){while (head != NULL){curr = head;head = head->next;delete curr;}}public:SList(int size = 100) { init(); }//构造,默认大小100,没有什么实际用处,只是为了与前面保持一致~SList() { removeall(); }void print() const{SLink<E>*temp = head;for (int i = 0; i < cnt; i++){temp = temp->next;cout <<temp->element<< " --> ";}cout << "NULL" << endl;}void clear() { removeall(); init(); }void insert(const E&it){curr->next = new SLink<E>(it, curr->next);if (tail == curr)tail = curr->next;cnt++;}void append(const E&it){tail = tail->next = new SLink<E>(it, NULL);cnt++;}E remove(){assert(curr->next != NULL);E it = curr->next->element;SLink<E>*ltemp = curr->next;if (tail = curr->next)tail = curr;curr->next = curr->next->next;delete ltemp;cnt--;return it;}void moveToStart() { curr = head; }void moveToEnd() { curr = tail; }void prev(){if (curr = head)return;SLink<E>*temp = head;while (temp->next != curr)temp = temp->next;curr = temp;}void next(){if (curr != tail)curr = curr->next;}int length() const{ return cnt; }int currPos()const{SLink<E>*temp = head;int i;for (i = 0; curr != temp; i++)temp = temp->next;return i;}void moveToPos(int pos){assert(pos >= 0 && pos <= cnt);curr = head;for (int i = 0; i < pos; i++)curr = curr->next;}const E&getValue()const{assert(curr->next != NULL);return curr->next->element;}
};
//双链表类的实现:Double_List.htemplate<typename E>
class DLink
{
public:E element;DLink*next;DLink*prev;DLink(const E&it, DLink*prevp, DLink*nextp){element = it;prev = prevp;next = nextp;}DLink(DLink*prevp = NULL, DLink*nextp = NULL){prev = prevp;next = nextp;}
};template<typename E>
class DList :public DLink<E>
{
private:DLink<E>*head;DLink<E>*tail;DLink<E>*curr;int cnt;void init(){//这里的head&tail为表头表尾节点,均为NULL;curr = head = new DLink<E>;tail = new DLink<E>;head->next = tail;tail->prev = head;cnt = 0;}void removeall(){while (head != NULL){curr = head;head = head->next;delete curr;}}public:DList(int size = 100) { init(); }//构造,默认大小100,没有什么实际用处,只是为了与前面保持一致~DList() { removeall(); }void print() const{DLink<E>*temp = head;cout << "NULL <--> ";for (int i = 0; i < cnt; i++){temp = temp->next;cout <<temp->element<< " <--> ";}cout << "NULL" << endl;}void clear() { removeall(); init(); }void insert(const E&it){curr->next=curr->next->prev = new DLink<E>(it,curr, curr->next);cnt++;}void append(const E&it){tail->prev = tail->prev->next = new DLink<E>(it, tail->prev,tail);cnt++;}E remove(){if (curr->next = tail)return NULL;E it = curr->next->element;DLink<E>*ltemp = curr->next;curr->next->next->prev=curr;curr->next = curr->next->next;delete ltemp;cnt--;return it;}void moveToStart() { curr = head; }void moveToEnd() { curr = tail; }void prev(){if(curr!=head)curr = curr->prev;}void next(){if (curr != tail)curr = curr->next;}int length() const { return cnt; }int currPos()const{DLink<E>*temp = head;int i;for (i = 0; curr != temp; i++)temp = temp->next;return i;}void moveToPos(int pos){assert(pos >= 0 && pos <= cnt);curr = head;for (int i = 0; i < pos; i++)curr = curr->next;}const E&getValue()const{assert(curr->next != NULL);return curr->next->element;}
};
/*《数据结构与算法分析(第三版)》——线性表(p62-p76)*/#include<iostream>
#include<cassert>
#include"ADT_List.h"
#include"AList.h"
#include"Single_List.h"
#include"Double_List.h"
using namespace std;int main()
{//test placesystem("pause");
}

基本概念与注意事项:

1.基本概念:空表、表头、表尾、有序线性表、无序线性表。

2.注意事项:

  • 在选择线性表的表示方法之前,首先应考虑这种表示法要支持的基本操作(表长度的增减、元素插入删除、获得元素的值、改变元素的值、表的生成清除和初始化、由当前节点找前驱后继元素等)。
  • 通过增加特殊的表头节点、表尾节点解决单双链表中的特例(链表为空或curr已经到达表头/表尾)。
  • 清除指针时,不要“丢失”被删除节点的内存,此内存应该返回给存储器;具体做法见代码中的析构函数。
  • 可利用空间表:取代较难使用的new和delete,更高效的使用内存,具体实现参见书本P70。
  • 双链表可以通过在一个指针域中存储两个指针值的异或结果来实现。
  • 在上面的示例中,我将线性表的"声明"和"实现"都放在头文件中。而编程规范告诫我们:将类的声明和实现分离,在头文件(.h文件)中尽量只包含声明,而在实现文件(.cpp文件)中负责实现!
    那么为什么要这么做呢?这是因为,在线性表的实现中,采用了模板;而C++编译器不支持对模板的分离式编译!简单点说,如果在*.h中声明,而在*.cpp中进行实现的话;当我们在其他类中创建模板类的对象时,会编译出错。

转载请注明出处:https://blog.csdn.net/Hodge_Z/article/details/85058673

数据结构——线性表:顺序表、单链表、双链表(C++)相关推荐

  1. 数据结构一线性表 (顺序表、单链表、双链表)

    版权声明:本文为openXu原创文章[openXu的博客],未经博主允许不得以任何形式转载 文章目录 1.线性表及其逻辑结构 1.1 线性表的定义 1.2 线性表的抽象数据类型描述 2.线性表的顺序存 ...

  2. 线性表→顺序表→链表 逐个击破

    一. 线性表 1. 前言 线性表,全名为线性存储结构.使用线性表存储数据的方式可以这样理解,即 " 把所有(一对一逻辑关系的)数据用一根线儿串起来,再存储到物理空间中 ".这根线有 ...

  3. rsa算法c语言实现_数据结构与算法之线性表-顺序表实现(C语言版本)

    原文托管在Github: https://github.com/shellhub/blog/issues/52 数据结构与算法之线性表-顺序表实现(C语言版本) 前言 数据结构与算法是一个程序员必备的 ...

  4. 线性表中的头插法双链表的学习

    #include <stdio.h> #include <malloc.h>/*** 线性表中的头插法双链表的学习 *//*** 人类*/ typedef struct Per ...

  5. 数据结构之 链表( 单链表, 双链表,循环链表)

    前篇.链表的概括 1.链表(Linked list)说明 是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按 ...

  6. 线性表-顺序表的基本操作

    线性表的定义和特点 线性表:由n(n≥0)个数据特性相同的元素构成的有限序列 线性表中元素的个数n(n≥0)称为线性表的长度 空表:n=0 对于非空的线性表或线性结构,特点为: 存在唯一的一个被称作& ...

  7. [数据结构]数据结构简介和顺序表

    目录 什么是数据结构 数据结构的特性 线性表 顺序表 创建一个动态顺序表 顺序表的增删查改 尾插和尾删除 尾插 头插头删 头插 头删 任意位置的插入和删除 插入 删除 查找和打印 总结 这天,小明和小 ...

  8. 数据结构之——《顺序表》

    数据结构之--<顺序表> 1.含义 2.分类 3.接口函数实现 4.顺序表的优缺点 1.含义 顺序表示用一段纹理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组 ...

  9. 数据结构学习心得——顺序表

    一.线性表的定义 线性表是具有相同特性数据元素的一个有限序列.该序列中所含元素的个数叫做线性表的长度,用n(n>0)表示. 二.线性表的存储结构 线性表的存储结构有顺序存储和链式存储两种.前者称 ...

  10. 【数据结构】【顺序表】 SqList *L与SqList*L的区别

    [数据结构][顺序表] SqList *&L与SqList*L的区别 显然,对于顺序表的抽象数据模型中的函数,其参数使用各不相同. SqList *&L的情况 它的意思是,L是对Lis ...

最新文章

  1. Focal Loss笔记
  2. 常用js代码整理、收集
  3. 成功解决ValueError: (‘Unknown transform primitive years. ‘, ‘Call ft.primitives.list_primitives() to get
  4. boost::test模块自定义用户异常转换器注册表的单元测试
  5. OpenCV训练分类器
  6. 深度学习:卷积神经网络
  7. C#回车切换焦点实现实例解析
  8. Oracle登陆SQL Plus,Oracle基础学习登陆SQLPLUS(一)
  9. 程序员如何避免身体被掏空?
  10. 华东师范大学2019年数学分析考研试题
  11. 20145236 《Java程序设计》第4周学习总结
  12. 十大游戏开发引擎优缺点对比
  13. python交易是什么意思_py交易是什么意思 py交易是什么梗
  14. java 循环字母_java循环26个字母
  15. android图片显示的方向问题
  16. 推荐7个免费自学网站提升自我价值必备网站
  17. javascript中substring,substr和slice对比
  18. 熊猫烧香制造者李俊出狱后开软件公司
  19. 惯量比多少合适_惯量比
  20. win10关闭smb协议服务器,防WannaCry勒索 Win10将删除SMBv1协议

热门文章

  1. 这个大力神杯,梅西已足足等了16年,AI预测:阿根廷冠军
  2. Linux 系统 校准时间
  3. spring.factories加载原理以及自定义EnvironmentPostProcessor
  4. 最流行的英文简历模板
  5. 面向对象的七种原则:单一职责原则,开放关闭原则
  6. 计算机4F,关于相干光学处理4F系统的解释
  7. 深化服务成工业品电商角逐新焦点
  8. shell脚本刷流量
  9. Swoole学习-Swoole入门指南
  10. 基于android的智能秤App,基于Android的智能运动健康秤产品App的设计与实现