版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lihn1987/article/details/55053068
欢迎转载和引用,若有问题请联系
若有问题,请联系
Email : [email protected]
QQ:2279557541
前言
链式结构除了上一篇结构中所讲的单项链表外, 还有另外几种。按照<大话数据结构>中所说
包括
- 静态列表
- 循环链表
双向链表
而在我看来,这几种链表基本没法独立成一种数据结构,只是对前面的扩展而已,有些甚至都意义不大,比如静态链表。
下面我来一个一个的介绍
静态链表
首先,静态的意思就是链表的大小是固定的,链表的意思是每一项数据间是需要索引联系的
所以得静态链表的意思就是固定大小的,由索引相互联系的数据结构。
《大话数据结构》住列举的例子是这样的:
在连续的内存空间内,以数组的形式实现,数组中每个数据的包含要存储的数据和索引。
代码简单描述下:
template<class DataType, int max_size>
class StaticLink
{
public:
struct LinkStu
{
DataType m_data; //保存数据
int m_next_idx; //指向下一个数据元素的数组下标索引
};
private:
LinkStu m_item_list[max_size]; //用于保存整个静态链表
unsigned int m_size; //整个数组的大小
};
在<大话数据结构>这本书中,对这个结构讲的比较详细,由于c和c++还是有些区别的,所以这里的实现看起来更加的简洁,而这种结构的示意图如下所示。
下面来说以下他的添加和删除操作
举个实例
下图描述的是一个普通的静态链表的状态
然后我们往里面添加一个数据,举个特殊的例子,在数据3和数据4之间添加一个数据5
发现只需要修改其前面一个的索引和后面所有数据的索引即可。
而删除一个数据同添加一样,只不过是个逆过程罢了。
这种结构的意义是什么呢?书上说的是,插入一个数据只需要修改索引,将索引一个个修改完就好,避免了数据的拷贝。这种看法我是不认同的,因为如果我们把上一章中顺序存储结构保存的变量类型改为指针,那么其拷贝的工作量同修改索引基本是一样的。那么书中的意思我之能理解为也许是对没有指针的编程语言说的。
循环链表
双向链表
这两种链表很常见,其实意思和他字面的意思基本一致。
循环链表指的是链表尾索引到链表头构成的一个环状的链表
双向链表指的是,每个数据节点除了有向后的索引外再加一个向前的索引。
具体的示意图我就不画了。
其他类型的线性表
之所以在文章的开头我说这几种链表只是对前面链表的扩展,其实更主要的是,按照这个扩展我们还能扩展出很多类型的线性表
比如
- 静态循环链表
- 静态双向链表
- 循环双向链表
等等各种组合,一个一个讲意义不大,说者无味,听者无趣~
参考内容 《大话数据结构》 陈杰
扫描二维码关注公众号,回复: 4108220 查看本文章