#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
数据结构(单向链表)
最新推荐文章于 2023-07-30 14:49:37 发布