25_静态单链表的实现

作者: 编程半岛 | 来源:发表于2018-01-25 17:58 被阅读48次

关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现

1. 单链表的一个缺点

长时间使用单链表对象频繁增加和删除数据元素,可能会导致堆空间产生大量的内存碎片,导致系统运行缓慢

2. 静态单链表设计思路:

在“单链表”的内部增加一片预留的空间,所有的Node对象都在这片空间中动态创建和动态销毁

3. 静态单链表的继承层次结构

4. 静态单链表的实现思路

  • 通过模板定义静态单链表类(StaticLinkLisk
  • 在类中定义固定大小的空间unsigned char[]
  • 重写createdestroy函数,改变内存的分配和归还方式
  • Node类中重载operator new,用于在指定内存上创建对象

5. 静态单链表的实现

StaticLinkList.h

#ifndef STATICLINKLIST_H
#define STATICLINKLIST_H

#include "LinkList.h"

namespace DTLib
{

template<typename T, int N>
class StaticLinkList : public LinkList<T>
{
protected:
    typedef typename LinkList<T>::Node Node;    // 重命名

    struct SNode : public Node                  // new操作符重载
    {
        void* operator new(unsigned int size, void* loc)
        {
            (void)size;
            return loc;
        }
    };

    unsigned char m_space[sizeof(SNode) * N];    // 预留空间大小
    int m_used[N];      // 标记数组

    Node* create()      // 重写create()
    {
        SNode* ret = NULL;

        for(int i=0; i<N; i++)
        {
            if( !m_used[i])
            {
                ret = reinterpret_cast<SNode*>(m_space) + i;
                ret = new(ret)SNode();
                m_used[i] = 1;
                break;
            }
        }

        return ret;
    }

    void destroy(Node* pn)  //重写destroy()
    {
        SNode* space = reinterpret_cast<SNode*>(m_space);
        SNode* psn = dynamic_cast<SNode*>(pn);

        for(int i=0; i<N; i++)
        {
            if( psn == (space + i))
            {
                m_used[i] = 0;
                psn->~SNode();
            }
        }
    }
public:
    StaticLinkList()
    {
        for(int i=0; i<N; i++)
        {
            m_used[i] = 0;
        }
    }

    int capacity()
    {
        return N;
    }

};

}
#endif // STATICLINKLIST_H

6. LinkList中封装createdestroy的函数的意义是什么?

是为了静态单链表(StaticLinkList)的实现做准备。StaticLinkListLinkList不同仅仅在于链表结点内存分配上的不同。因此,将仅有的不同封装于父类和子类的虚函数中

7. 小结

  • 顺序表与单链表相结合后衍生出静态单链表
  • 静态单链表是LinkList的子类,拥有单链表的所有操作
  • 静态单链表在预留的空间中创建结点对象
  • 静态单链表适合于频繁增删数据元素的场合(最大元素个数一定要固定)

声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

相关文章

  • 25_静态单链表的实现

    关键词: 单链表的一个缺点、静态单链表设计思路、静态单链表的继承层次结构、静态单链表的实现思路、静态单链表的实现 ...

  • C语言实现静态链表

    静态链表(单链表的一种形式) 有时,也可以借用一维数组来描述线性链表,我们称这种链表为静态链表。 静态链表需要实现...

  • 数据结构_知识点_静态链表

    1. 静态链表定义 静态链表其实就是使用数组去代替指针以实现单链表。结点定义如下: 需要注意的是: 数组的第一个和...

  • 静态链表——数据结构预习

    其实一般有单链表的话,应该用不着静态链表。然而并不是什么编程语言都有指针,这时静态链表可以起到单链表的作用。静态链...

  • 线性表之单链表实现

    线性表之单链表实现 实现单链表的初始化、插入、删除等基本运算 实现单链表的输入、输出运算 实现单链表的逆置、归并、...

  • 单链表 & 双链表& 单向循环链表的实现

    单链表 具体实现: 双链表 代码实现: 单向循环链表的实现 代码实现:

  • 链表基本操作

    1、删除单链表节点 2、插入单链表结点 单链表具体实现

  • PHP 实现数据结构

    参考诸多视频和文章,主要通过PHP 实现线性表的顺序存储结构,单链表,静态链表,双向链表以及二叉树等数据结构,代码...

  • 数据结构——线性表

    线性表分为顺序存储结构和链式存储结构(单链表,静态链表,循环链表,双向链表)。 单链表(**一种动态结构,所占空间...

  • leetcode 单链表的各种算法

    1 递归实现:合并两个有序的单链表 2 递归实现:单链表逆序存入vector 3 循环实现:快慢指针找到单链表中间...

网友评论

    本文标题:25_静态单链表的实现

    本文链接:https://www.haomeiwen.com/subject/mzpvaxtx.html