数据结构(十 一)之静态单链表

1.1 静态单链表
1.1.1 静态单链表的引出

  • 如果需要频繁的增删数据,单链表就可以
  • 如果数据元素的最大个数固定,那有没有更好的选择呢

1.1.2 单链表的缺陷

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

1.1.3 新的线性表

  • 设计思路:在单链表的内部增加一片预留的空间,所有的Node 对象都在这片空间中动态创建和动态销毁
    在这里插入图片描述

1.2 静态单链表的实现

1.2.1 实现思路

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

1.2.2

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

    struct SNode : public Node
    {
        void * operator new(unsigned int size, void * loc)
        {
            return loc;
        }
    };

    unsigned char m_space[sizeof(SNode) * N];
    int m_used[N];

    Node * create()
    {
        SNode * ret = NULL;

        for(int i = 0; i < N; i++)
        {
            if(!m_used[i])
            {
                ret = reinterpret_cast<SNode*>(m_space) + i;   //这里仅仅是创建了空间,如果Node的T类型是类类型,就需要构造函数的调用
                ret = new(ret)SNode();
                m_used[i] = 1;
                break;
            }
        }

        return ret;

    }

    void destory(Node * pn)
    {
        SNode * space  = reinterpret_cast<SNode*>(m_space);
        SNode * psn = dynamic_cast<SNode*>(pn);
        for(int i = 0; i < N; i++)
        {
            if(pn == (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;
    }


};

1.2.3 Q & A

  • LinkList 中封装create 和destroy() 函数的意义?
    • 为静态单链表(StaticLinkList)的实现做准备。StaticLinkList与 LinkList的不同仅在与链表节点内存分配上的不同,因此,将仅有的不同封装于父类和子类的虚函数中

参考一 : 狄泰软件课程

如有侵权:请联系邮箱 1986005934@qq.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值