#include <iostream>
using namespace std;
// 定义一个单向链表类
// typedef int ElemType;//类型重命名
// using ElemType = int; // 类型重命名
template <typename T>
class LinkedList;
template <typename ElemType> // 这里就是元素类型相当于一个参数
class Node // 节点类
{
template <typename T>
friend class LinkedList; // 声明友元类的时候也用加上模版的声明
private:
ElemType data;
Node *next;
public:
Node(ElemType data) : data{data}, next{nullptr} {}
template <typename T1>
friend ostream &operator<<(ostream &out, LinkedList<T1> &d);
};
template <typename T>
class LinkedList // 带头结点的单向链表类
{
private:
int num;
Node<T> *first;
Node<T> *last;
public:
// 构造函数
LinkedList() : num{0}, first{nullptr}, last{nullptr} {}
// 尾插法
void InsertTail(T d);
// 尾删除
T DeleteTail();
// 头插法
void InsertFront(T d);
// 头删法
T DeleteFront();
// 获取元素个数
int GetNum() const;
// 链表是否为空
bool IsEmpty();
// 析构函数
~LinkedList();
void Clear();
template <typename T1>
friend ostream &operator<<(ostream &out, LinkedList<T1> &d);
};
// 尾插法
template <typename T>
void LinkedList<T>::InsertTail(T d)
{
// 创建节点并初始化
Node<T> *pnew = new Node<T>{d};
// 增加节点
if (IsEmpty())
{
first = last = pnew;
}
else
{
last->next = pnew;
last = pnew;
}
num++;
}
// 尾删除
template <typename T>
T LinkedList<T>::DeleteTail()
{
// 空链表
if (IsEmpty())
{
throw runtime_error{"DeleteTail:LinkedList IsEmpty"};
}
T d; // 删除的节点的数据域
if (first == last)
{
d = first->data;
free(first);
first = last = nullptr;
}
else
{
d = last->data;
Node <T>*p = first; // 遍历指针
while (p->next != last)
{
p = p->next;
} // 此时 p指向倒数第二个
p->next = nullptr;
free(last);
last = p; // 更新尾节点
}
num--;
return d;
}
// 头插法
template <typename T>
void LinkedList<T>::InsertFront(T d)
{
// 创建节点并初始化
Node<T> *pnew = new Node<T>{d};
// 增加节点
if (IsEmpty())
{
first = last = pnew;
}
else
{
pnew->next = first;
first = pnew;
}
num++;
}
// 头删法
template <typename T>
T LinkedList<T>::DeleteFront()
{
// 空链表
if (IsEmpty())
{
throw runtime_error{"DeleteTail:LinkedList IsEmpty"};
}
T d = first->data;
Node<T> *p = first; // p在要删除的节点
first = p->next;
if (first)
p->next = nullptr;
else
last = nullptr;
free(p);
p = nullptr;
num--;
return d;
}
// 获取元素个数
template <typename T>
int LinkedList<T>::GetNum() const
{
return num;
}
// 链表是否为空
template <typename T>
bool LinkedList<T>::IsEmpty()
{
if (num == 0 && first == nullptr && last == nullptr)
return true;
else
return false;
}
// 析构函数
template <typename T>
LinkedList<T>::~LinkedList()
{
while (!IsEmpty())
{
DeleteTail();
}
first = last = nullptr;
num = 0;
}
// 清空链表
template <typename T>
void LinkedList<T>::Clear()
{
while (!IsEmpty())
{
DeleteTail();
}
first = last = nullptr;
num = 0;
}
template <typename T1>
ostream &operator<<(ostream &out, LinkedList<T1> &d)
{
cout << "=================" << endl;
if (!d.IsEmpty())
cout << "num = " << d.num << "first = " << d.first->data << "last = " << d.last->data << endl;
else
cout << "num = " << d.num << endl;
Node<T1> *p = d.first;
while (p)
{
cout << p->data << ",";
p = p->next;
}
// out << endl;
return out;
}
int main()
{
// 实例化对象
LinkedList<int> l;
cout << l.IsEmpty() << endl;
cout << l << endl;
for (int i = 0; i < 3; i++)
{
l.InsertTail(i);
} // 0 1 2
cout << l << endl;
for (int i = 4; i < 8; i++)
{
l.InsertFront(i);
} // 7 6 5 4 0 1 2
cout << l << endl;
while (!l.IsEmpty())
{
cout << l.DeleteTail() << endl;
}
cout << l << endl;
}
C++代码——模版类链表(实现链表的插入和删除)
最新推荐文章于 2026-08-22 20:00:00 发布
&spm=1001.2101.3001.5002&articleId=143132438&d=1&t=3&u=48cc77666ec34fefafe339862cfd10d3)
169

被折叠的 条评论
为什么被折叠?



