数据结构(单向链表)

来源:互联网 发布:rar怎么解压到mac 编辑:程序博客网 时间:2024/03/28 23:41
#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
原创粉丝点击