您的位置:首页 > 理论基础 > 数据结构算法

数据结构之“Ordered List and Sorted List”(一)

2016-03-04 14:45 489 查看
本系列文章将学习我们生活中最常用也最简单的一种数据结构——List(列表,点击打开链接)。List就是一个元素项(items)序列,支持“添加”、“删除”和“访问元素”等操作。本系列文章主要学习两种List——Ordered List(有序列表)和Sorted List(排序列表)。

一、区分概念

这两种List从字面上看,容易让人混淆,我举几个实际生活中的例子两展示它们之间的区别。

假设我们要写一本介绍《数据结构》的书,每一种数据结构占一个章节,但是没有章节编号,仅以“title,标题”作为章节标识,如“Array”、“Linked List”“Stack”、“Queue”、“List”、“Tree”、“Graph”等。那么,这个包含各章节标题的列表就是一个“Ordered List”,也可以将它看作是书的目录(不带编号)或者一个Word文档的导航条。这个列表中的每一项的位置是有意义的,它表示整本书的内容排编顺序,也可以按index进行索引,如第一项是“Array”,第二项是“Linked
List”。

假如我们要编写一个《数据结构的手册》——CHM的电子书,这个手册会安排一个“索引表”。这个“索引表”的每一项就是一个“title”,(如果title的数量很多)为了方便用户查找,我们会按字母顺序排列这个索引表,如下:



如上图,左边是一个“Ordered List”;右边是一个“Sorted List”,它的项是按字母顺序排列。如果,我们现在要新增一项——“Hash table”。对于“Ordered List”,可以插入任意位置,插入后之前的部分项位置值有变化;而对于“Sorted List”,根据字母顺序,“Hash table”只能插入“Graph”和“Linked List”之间。

二、类层次和接口

在本书的类体系中,List是继承子“SearchableContainer”(点击打开链接),它是在“Container”的基础上增加了四个接口(参考我的“数据结构之容器系列文章”)。

class SearchableContainer : public virtual Container
{
public:
virtual bool IsMemeber(Object const &) const = 0;
virtual void Insert(Object &) = 0;
virtual void Withdraw(Object &) = 0;
virtual Object & Find(Object const &) const = 0;
};
注:其中,“Ismember”函数是要进行匹配,按地址比较;而“Find”函数是找相等值,按值进行比较。

List在“SearchableContainer”的继承上又增加了几个接口,如下:

class Position : public Iterator
{
};

class List : public virtual SearchableContainer
{
public:
virtual Object & operator[](unsigned int) const = 0;
virtual Object & operator[](Position const &) const = 0;
virtual Position & FindPosition(Object const &) const = 0;
virtual void Withdraw(Position const &) = 0;
};
注:1,“FindPosition”也是按地址匹配。

2,列表中各项既可以按index索引,也可以按位置(广义index,支持链表)索引。

“Ordered List”再增加两个插入接口:

class OrderedList : public virtual List
{
public:
virtual void InsertAfter(Position const &, Object &) = 0;
virtual void InsertBefore(Position const &, Object &) = 0;
};


三、完整代码

#pragma once
#include "SearchableContainer.h"

class Position : public Iterator { }; class List : public virtual SearchableContainer { public: virtual Object & operator[](unsigned int) const = 0; virtual Object & operator[](Position const &) const = 0; virtual Position & FindPosition(Object const &) const = 0; virtual void Withdraw(Position const &) = 0; };

class OrderedList : public virtual List { public: virtual void InsertAfter(Position const &, Object &) = 0; virtual void InsertBefore(Position const &, Object &) = 0; };

class SortedList : public List
{
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: