在 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++ 中的模板建立連結串列。閱讀本文後,讀者將能夠建立具有使用者定義資料型別的程式,並同時使用具有多種資料型別的連結串列。