数据结构(单向链表)

#ifndef LINKLIST_H
#define LINKLIST_H

//链表节点
template<class T>
class LinkListData
{
public:
    LinkListData(T data)
    {
        this->data = data;
        next = nullptr;
    }
    LinkListData()
    {
        this->data = (T)0;
        next = nullptr;
    }
    ~LinkListData()
    {

    }
    LinkListData<T> *next;  //下一个数据地址

    //获取数据
    T GetData()
    {
        return data;
    }

public:
    T data;         //数据
};

template<class T>
class LinkList
{
public:
    LinkList()
    {
        m_Length = 0;
        m_Root = new LinkListData<T>();
    }
    ~LinkList()
    {
        Clear();
        delete m_Root;
        m_Root = nullptr;
    }
    //链表是否为空或NULL
    bool IsEmptyOrNull()
    {
        if (m_Root->next == nullptr && m_Length == 0)
        {
            return true;
        }
        else if (m_Root->next != nullptr && m_Length > 0)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    //链表中数据的数量
    int GetLength()
    {
        return m_Length;
    }
    //查找一个数据是否在链表中
    bool Contains(T data)
    {
        LinkListData<T> *cur = m_Root->next;
        while (cur != nullptr)
        {
            if (cur->data == data)
            {
                return true;
            }
            cur = cur->next;
        }
        return false;
    }
    //添加一个数据
    int Add(T data)
    {
        if (Contains(data))
        {
            return 0;
        }
        LinkListData<T> *addData = new LinkListData<T>(data);

        LinkListData<T> *cur = m_Root;
        while (cur->next != nullptr)
        {
            cur = cur->next;
        }
        cur->next = addData;
        m_Length++;
    }
    //删除一个数据
    int Remove(T data)
    {
        LinkListData<T> *delData = LocateData(data);
        if (delData == nullptr)
        {
            return 0;
        }

        LinkListData<T> *previewData = LocatePriviewData(delData);
        previewData->next = delData->next;
        delete delData;
        delData = nullptr;
        m_Length--;
    }
    //清空
    void Clear()
    {
        if (IsEmptyOrNull())
        {
            return;
        }
        LinkListData<T> *cur = m_Root->next;

        while (cur != nullptr)
        {
            LinkListData<T> *delData = cur;
            cur = cur->next;
            delete delData;
        }
        m_Length = 0;
        m_Root->next = nullptr;
    }
    //获取索引Index的数据
    LinkListData<T> *operator [](int index)
    {
        if (index < 0 || IsEmptyOrNull())
        {
            return nullptr;
        }
        int i = 0;
        LinkListData<T> *cur = m_Root->next;
        while (cur != nullptr && i < index)
        {
            cur = cur->next;
            i++;
        }

        if (cur == nullptr || i > index)
        {
            return nullptr;
        }

        return cur;
    }

protected:
    //查找链表元素
    LinkListData<T> *LocateData(T data)
    {
        LinkListData<T> *cur = m_Root->next;
        while (cur != nullptr)
        {
            if (cur->data == data)
            {
                return cur;
            }
            cur = cur->next;
        }
        return nullptr;
    }
    //查找一个链表元素的前驱
    LinkListData<T> *LocatePriviewData(LinkListData<T> * locateData)
    {
        if (locateData == nullptr)
        {
            return nullptr;
        }

        LinkListData<T> *cur = m_Root->next;
        //保存前驱
        LinkListData<T> *previewData = m_Root;
        while (cur != nullptr)
        {
            if (cur == locateData)
            {
                return previewData;
            }
            previewData = cur;
            cur = cur->next;

        }
        return nullptr;
    }

protected:

    //长度
    int m_Length;
    //链表的头数据,为空则表示无数据
    LinkListData<T> *m_Root;
};
#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值