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