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