在 C++ 中使用模板的链表
模板是在要使用的数据类型存在问题时创建的类定义数据类型。使用模板可以灵活地处理数据类型,并且只使用在编译期间作为输入提供的数据类型。
本文讨论了如何在 C++ 中使用模板形成链表。
在 C++ 中使用模板的链表
本文介绍了一个包含主文件(.cpp
文件)的 3 部分程序,该文件从其头文件(.h
)中提取节点和链表数据。该程序通过包含驱动程序方法的主文件提供输入。
首先,让我们了解如何使用模板创建节点。
在 C++ 中初始化模板类中的数据成员
这是程序在编译期间启动的第一个头文件。这里定义了两个类:create_list
和 Init
。
// file: init.h
#ifndef _INIT_H
#define _INIT_H
template <typename T>
class create_list;
template <typename T>
class Init {
friend class create_list<T>;
public:
Init(T data = 0, Init<T> *next = 0) : data(data), next(next) { /* empty */
}
private:
T data;
Init<T> *next;
};
#endif
语法 template<typename T> class create_list;
创建一个类型为 T 的类。这告诉编译器使用 T 作为用户定义的数据类型,直到给出主数据类型。
在 C++ 程序中使用模板提供了一个有趣的功能,可以使用用户定义的数据类型定义变量。同样,方法也可以定义为数据类型,使其成为程序员的有用工具。
使用语法 friend class create_list<T>;
指示编译器将类 create_list
标记为朋友类。朋友类在此头文件中共享其私有和公共成员。
一旦类 create_list
被定义,类 Init
被创建为类型 T。
当编译器执行语法 friend class create_list<T>;
时,它指示编译器在此类中使用头文件 create_list.h
中的私有和公共成员。
使用 C++ 中的模板创建链接列表需要两个主要变量,一个存储输入值的数据变量和一个指向下一个指针的节点变量。
在这个程序中,这两个主要变量被定义为 data
和 next
。然后在对它们进行操作之前,使用默认值初始化构造函数的私有和公共成员。
最后,构造函数 public
的成员变量被构造函数 private
的成员变量初始化。
在 C++ 中使用模板创建类链表
本节讨论本文三部分中的第二部分。这里讨论的程序使用语法 #include "init.h"
导入 init.h
头文件,并使用其数据成员使用 C++ 中的模板创建链接列表。
在模板类 create_list
中,有四个公共成员 - 一个构造函数 create_list()
、一个析构函数 ~create_list()
和两个成员方法 void insert()
和 void display()
。
定义了两个私有成员,指针*up
和*down
,数据类型为 T。这种类定义的数据类型允许程序使用驱动程序中的任何数据类型,从而使程序员无需返回源代码修改东西。
指针变量 head 和 tail 在构造函数 create_list
中初始化。
template <typename T>
create_list<T>::create_list() : up(0), down(0)
在析构函数 ~create_list()
中,存储在内存中的对象被释放。
在这里,如果对象 up
中存储了一些值,则将其复制到指针*a
中;指针 *b
被赋予 0
值。
指针变量 head 和 tail 在构造函数 create_list
中初始化。
template <typename T>
create_list<T>::~create_list() {
if (up) {
Init<T> *a = up;
Init<T> *b = 0;
对于 a
具有值的次数,它被复制到 b
,它充当变量 a
内对象的占位符。然后,a
被赋予存储在 next 指针内的值,最后,b
内的值被释放。
while (a) {
b = a;
a = a->next;
delete b;
}
在链表中添加值的方法
这部分程序创建了一个类类型为 T 的方法,该方法将 info 作为参数。在方法内部,给出了一个 if-else
条件。
down
变量用于指向下一个指针。在这里,if
条件检查变量 up
是否非空,它从参数信息创建一个新对象并将其传输到变量 down
。
在 else
条件中,变量 up
被赋予 down
的值,它是从参数 value
创建的对象。
template <typename T>
void create_list<T>::insert(T value) {
if (up) {
down->next = new Init<T>(value);
down = down->next;
} else {
up = down = new Init<T>(value);
}
}
打印链表内的值的方法
此方法打印链表的内容。变量 up
内的指针值被复制到变量*a
。
对于给定指针 a
中值存在的次数,while 循环打印它,然后将 a
移动到 up
指针。
template <typename T>
void create_list<T>::display() {
if (up) {
Init<T> *a = up;
while (a) {
cout << a->data << "->";
a = a->next;
}
以下部分显示了使用 C++ 模板创建链表的代码:
// file createlist.h
#ifndef _CREATELIST_H
#define _CREATELIST_H
#include <iostream>
using namespace std;
#include "init.h"
template <typename T>
class create_list {
public:
create_list();
~create_list();
void insert(T);
void display();
private:
Init<T> *up;
Init<T> *down;
};
#endif
template <typename T>
create_list<T>::create_list() : up(0), down(0) { /* empty */
}
template <typename T>
create_list<T>::~create_list() {
if (up) {
Init<T> *a = up;
Init<T> *b = 0;
while (a) {
b = a;
a = a->next;
delete b;
}
cout << endl;
}
}
template <typename T>
void create_list<T>::insert(T value) {
if (up) {
down->next = new Init<T>(value);
down = down->next;
} else {
up = down = new Init<T>(value);
}
}
template <typename T>
void create_list<T>::display() {
if (up) {
Init<T> *a = up;
while (a) {
cout << a->data << "->";
a = a->next;
}
cout << endl;
}
}
使用来自 .cpp
文件的模板创建链接列表
这是程序的最后一部分。它包括 create_list
头文件,并创建了 main 函数。
链表模板的数据类型在主函数内部设置。在这里,char
用于打印给定 for
循环内数字的 ASCII 值。
for
循环运行十次并打印从 65 到 75 的 ASCII 值,字母 A 到 J。list.insert(i);
语法将 i
的值传递给方法 add,该方法被插入到链表中,然后传递另一个值。
最后,list.display();
打印链表的内容。
// file run.cpp
#include "create_list.h"
int main(int argc, char *argv[]) {
create_list<char> created_list;
for (char i = 65; i < 75; i++) created_list.insert(i);
created_list.display();
结论
本文详细解释了如何使用 C++ 中的模板创建链表。阅读本文后,读者将能够创建具有用户定义数据类型的程序,并同时使用具有多种数据类型的链表。