#pragma once
template<typename T>
struct LinkNode
{
T data;
LinkNode<T>* pNext;
};
template<typename T>
class Link
{
public:
Link();
~Link();
//头部插入节点
void push_head(const T& val);
//在指定位置插入节点
void insert(const T& val, int pos);
//删除所有数据
void DeleteAll();
//查找某元素并返回其节点地址
LinkNode<T>* Find(const T& val);
//按元素删除节点
void DeleteElem(const T& val);
//尾部删除
void DeleteLast();
//第一个节点删除
void DeleteFirst();
//链表反转
void Reserve();
//打印链表
void Print();
private:
LinkNode<T>* pHead;
};
template<typename T>
Link<T>::Link()
{
pHead = new LinkNode<T>;
pHead->pNext = nullptr;
}
template<typename T>
Link<T>::~Link()
{
DeleteAll();
delete pHead;
pHead = nullptr;
}
template<typename T>
void Link<T>::push_head(const T& val)
{
LinkNode<T>* node = new LinkNode<T>();
node->data = val;
node->pNext = pHead->pNext;
pHead->pNext = node;
}
template<typename T>
void Link<T>::insert(const T& val, int pos)
{
LinkNode<T>* newNode = new LinkNode<T>();
newNode->data = val;
LinkNode<T>* node = pHead;
for(int i = 1; i < pos; i++)
{
if (node->pNext == nullptr)
break;
node = node->pNext;
}
newNode->pNext = node->pNext;
node->pNext = newNode;
}
template<typename T>
void Link<T>::DeleteAll()
{
while (pHead->pNext)
{
LinkNode<T>* pNode = pHead->pNext;
pHead->pNext = pHead->pNext->pNext;
delete pNode;
}
}
template<typename T>
LinkNode<T>* Link<T>::Find(const T& val)
{
LinkNode<T>* pNode = pHead->pNext;
while (pNode)
{
if (pNode->data == val)
{
return pNode;
}
pNode = pNode->pNext;
}
return nullptr;
}
template<typename T>
void Link<T>::DeleteElem(const T& val)
{
LinkNode<T>* pNode = pHead;
while (pNode->pNext)
{
if (pNode->pNext->data == val)
{
LinkNode<T>* delNode = pNode->pNext;
pNode->pNext = delNode->pNext;
delete delNode;
}
else
{
pNode = pNode->pNext;
}
}
}
template<typename T>
void Link<T>::DeleteLast()
{
LinkNode<T>* pNode = pHead;
if (pNode->pNext == nullptr)
return;
while (pNode->pNext->pNext)
{
pNode = pNode->pNext;
}
LinkNode<T>* delNode = pNode->pNext;
pNode->pNext = nullptr;
delete delNode;
}
template<typename T>
void Link<T>::DeleteFirst()
{
if (pHead->pNext)
{
LinkNode<T>* delNode = pHead->pNext;
pHead->pNext = delNode->pNext;
delete delNode;
}
}
template<typename T>
void Link<T>::Reserve()
{
LinkNode<T>* pNode = pHead->pNext;
if (pNode == nullptr)
return;
while (pNode->pNext)
{
LinkNode<T>* node = pNode->pNext->pNext;
pNode->pNext->pNext = pHead->pNext;
pHead->pNext = pNode->pNext;
pNode->pNext = node;
}
}
template<typename T>
void Link<T>::Print()
{
LinkNode<T>* pNode = pHead->pNext;
while (pNode)
{
std::cout << pNode->data << std::endl;
pNode = pNode->pNext;
}
}
c++单项链表
于 2023-02-17 13:41:17 首次发布