在 C++ 中使用模板的链表

Jay Shaw 2023年10月12日
  1. 在 C++ 中使用模板的链表
  2. 使用来自 .cpp 文件的模板创建链接列表
  3. 结论
在 C++ 中使用模板的链表

模板是在要使用的数据类型存在问题时创建的类定义数据类型。使用模板可以灵活地处理数据类型,并且只使用在编译期间作为输入提供的数据类型。

本文讨论了如何在 C++ 中使用模板形成链表。

在 C++ 中使用模板的链表

本文介绍了一个包含主文件(.cpp 文件)的 3 部分程序,该文件从其头文件(.h)中提取节点和链表数据。该程序通过包含驱动程序方法的主文件提供输入。

首先,让我们了解如何使用模板创建节点。

在 C++ 中初始化模板类中的数据成员

这是程序在编译期间启动的第一个头文件。这里定义了两个类:create_listInit

// 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++ 中的模板创建链接列表需要两个主要变量,一个存储输入值的数据变量和一个指向下一个指针的节点变量。

在这个程序中,这两个主要变量被定义为 datanext。然后在对它们进行操作之前,使用默认值初始化构造函数的私有和公共成员。

最后,构造函数 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++ 中的模板创建链表。阅读本文后,读者将能够创建具有用户定义数据类型的程序,并同时使用具有多种数据类型的链表。