25+26 静态单链表 以及相应的问题

首先 为什么会要用静态单链表  单链表它不香吗?

主要是因为 单链表 大量的增加 和删除 会导致 堆空间 存在 大量内存水平 还会使 系统速度变慢;

借用顺序线性表的思路 不一定要在 堆上  申请空间 可以在其他位置申请任意的空间,所以才有了静态单链表;

#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{
        void* operator new(size_t size,void* loc){
            (void)size;
            return loc;
        }
    };

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

    Node* create(){
        //使用上面申请的空间 creat
        SNode* ret = NULL;
        for(int i=0;i<N;i++){
            if(!m_used[i]){
                //如果仅仅是这样 只是分配内存 并没有涉及到Node构造函数
                ret = reinterpret_cast<SNode*>(m_space) + i; //这里的+i,什么意思 和上面一段连续的内存 有什么关系,可以自己测试一下
                ret = new(ret)SNode();//这是什么方式(显示调用?)调用了构造函数
                m_used[i]=1;
                break;
            }
        }
        return ret;
    }

    void destroy(Node *pn){
         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();
                 break;
             }
         }
    }

public:

    StaticLinkList(){
           for( int i =0;i<N;i++){
               m_used[i]=0;
           }
    }

    int capacity(){
        return N;
    }
    //再不加析构函数 这个bug 导致我一直不能跑通相应的程序
    //原因就是因为 调用父类的 destory函数的delete 删除了 我子类在其他空间(栈)的资源 而delete只能是删除堆上的空间
    ~StaticLinkList(){
        this->clear();//这里为什么要加上析构函数? 这里clear  的对象就是 子列的destory() 函数了 为什么?因为多态性不会发生在构造 和析构函数

    }
};

}
#endif // STATICLINKLIST_H

这里 有好几个点需要注意的(自己的盲点)


    unsigned char m_space[sizeof(SNode) * N];这句话只是内存并不会调用NODE的构造函数

所以需要自己调用构造函数啦。

 ret = new(ret)SNode();//这是什么方式(显示调用?)调用了构造函数new(要回头看一下c++) 重载 new ()

还有就是析构函数不支持 多态性的问题  这个是大问题了!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值