C++ 動的に連結リストを作成する
連結リストとは?
最も基本的なデータ構造の1つであり、他のデータ構造の実装に使われる。リンクリスト、リンクトリストとも表記される。
一連のノードが、任意のデータフィールド群を持ち、1つか2つの参照(リンク)により次(および前)のノードを指している。連結リストの主な利点は、リスト上のノードを様々な順番で検索可能な点である。連結リストは自己参照型のデータ型であり、同じデータ型の別のノードへのリンク(またはポインタ)を含んでいる。連結リストは場所が分かっていれば、ノードの挿入や削除を定数時間で行うことができる。
連結リスト - Wikipedia
要するに、複数のデータを数珠つなぎに保持するデータ構造を「連結リスト」と呼びます。
C言語では、次のノードを指すポインタを定義した構造体を用意し、
数珠つなぎにするパターンが一般的です。
C++ でのサンプルプログラム
今回は、C++で連結リストを作成するサンプルプログラムを作成。
using namespace std; struct RenketsuList { string key; RenketsuList *next; }; int AddList(RenketsuList *&list) { int ret = 0; list = new RenketsuList; if (list == nullptr) { cout << "No Memory.¥n"; ret = -1; } list->next = nullptr; return ret; } void freeList(RenketsuList *&list) { RenketsuList *tmp = list; RenketsuList *swap = nullptr; while(tmp) { swap = tmp->next; delete tmp; tmp = nullptr; tmp = swap; } } int main() { int ret = 0; cout << "Renketsu List Test Start!!" << endl; // テストデータ std::vector<std::string> keyList; keyList.push_back("Test01"); keyList.push_back("Test02"); keyList.push_back("Test03"); RenketsuList *pList = nullptr; RenketsuList *pTmp = nullptr; bool isHead = true; // 連結リストを動的に作成するループ for(auto item : keyList) { if (isHead) { ret = AddList(pList); pTmp = pList; } else { ret = AddList(pTmp->next); pTmp = pTmp->next; } if (ret != 0) { // メモリ解放 freeList(pList); return ret; } pTmp->key = item; if (isHead) { isHead = false; } } // データ確認 int i = 0; RenketsuList *pChk = pList; while(pChk) { ++i; cout << i << "件目 key:" << pChk->key << endl; pChk = pChk->next; } // メモリ解放 freeList(pList); cout << "Renketsu List Test End!!" << endl; return ret; }