在复习C++模板时,在课本上发现了这个结点类模板,记下来,以后可能会用着,注释在代码上。
链表的结点包括数据和指针域,是链表的基本构件。节点的数据域用于存放群体中元素的内容,既可以是若干个基本类型的数据,也可以是自定义类型的数据,甚至是内嵌对象。结点的指针域用于存放链表中另一个结点的地址。
//结点类模板
template <class T>
class Node
{
private:
Node<T>* next; //指向后继结点的指针
public:
T data; //数据域
Node(const T& data, Node<T>* next = 0); //构造函数
void insertAfter(Node<T>* p); //在本结点之后插入一个同类结点p
Node<T>* deleteAfter(); //删除本结点的后继结点,并返回其地址
Node<T>* nextNode(); //获取后继结点的地址
const Node<T>* nextNode() const; //获取后继结点的地址
};
//类的实现部分
//构造函数,初始化数据和指针成员
template <class T>
Node<T>::Node(const T & data, Node<T> * next) : data(data), next(next) {};
//返回后继结点的指针
template <class T>
Node<T> * Node<T>::nextNode()
{
return next;
}
//返回后继结点的指针
template <class T>
const Node<T>* Node<T>::nextNode() const
{
return next;
}
//在当前结点之后插入一个结点P
template <class T>
void Node<T>::insertAfter(Node<T>* p)
{
p->next = next; //p结点指针域指向当前结点的后继结点
next = p; //当前结点的指针域指向p
}
//删除当前结点的后继结点,并返回其地址
template <class T>
Node<T>* Node<T>::deleteAfter()
{
Node<T>* tempPtr = next; //将欲删除的结点地址存储到tempPtr中
if (next == 0) //如果当前结点没有后继结点,则返回空指针
return 0;
next = tempPtr->next; //使当前结点的指针域指向tempPtr的后继结点
return tempPtr; //返回被删除的结点的地址
}
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
Node<int> n1(1, NULL);
Node<int> n2(2, &n1);
cout << n2.nextNode()->data << endl;
return 0;
}
根据结点类模板,可以继续编写链表类模板
#include <iostream>
// 链表结点类
template <typename T>
class Node {
public:
T data;
Node<T>* next;
Node(T val, Node<T>* n = nullptr) : data(val), next(n) {}
};
// 链表类
template <typename T>
class LinkedList {
private:
Node<T>* head;
Node<T>* tail;
public:
LinkedList() : head(nullptr), tail(nullptr) {}
// 在链表尾部插入元素
void append(T value) {
Node<T>* newNode = new Node<T>(value);
if (head == nullptr) {
head = tail = newNode;
} else {
tail->next = newNode;
tail = newNode;
}
}
// 获取链表头结点
Node<T>* getHead() {
return head;
}
// 遍历并打印链表
void print() {
Node<T>* curr = head;
while (curr != nullptr) {
std::cout << curr->data << " ";
curr = curr->next;
}
std::cout << std::endl;
}
};
int main() {
// 声明两个 int 类型的链表
LinkedList<int> a, b;
// 向 a 和 b 中插入 5 个元素
for (int i = 1; i <= 5; i++) {
a.append(i);
b.append(i * 10);
}
// 打印 a 和 b 的元素
std::cout << "List a: ";
a.print();
std::cout << "List b: ";
b.print();
// 将 b 中的元素加入 a 的尾部
Node<int>* curr = b.getHead();
while (curr != nullptr) {
a.append(curr->data);
curr = curr->next;
}
// 打印合并后的 a
std::cout << "List a after merging: ";
a.print();
return 0;
}
--选自C++语言程序设计(第五版)