片方向リストの実装例 (C言語)
今回はC言語でリンクリストを実装する際の例を記述します。
ノード構造定義
struct LinkedNode
{
int value; // 値(任意のデータ)
LinkedNode* pNext; // 次のノードへのポインタ(リンク)
};
ノードは任意のデータとリンク情報を持ちます。
※実際に使う際にはデータの部分を用途に応じて変更します。
ノードの基本処理
LinkedNode* pHead = NULL; // 先頭ノード
LinkedNode* pTail = NULL; // 末尾ノード
// ノードの追加
void AddNode(LinkedNode* pNode)
{
// ノードがない場合は先頭=末尾のノードとなる
if (pHead == NULL)
{
pHead = pTail = pNode;
return;
}
// 現在の末尾の次のノードとして登録する
pTail->pNext = pNode;
// 追加されたノードを末尾にする
pTail = pNode;
}
// ノードの削除
void RemoveNode(LinkedNode* pNode)
{
LinkedNode* prev = NULL;
LinkedNode* temp = pHead;
// 先頭のノードから順に一致するノードを検索していく
while (temp)
{
// 一致すれば削除
if (temp == pNode)
{
// 削除するノードの手前にノードがあれば
// 手前のノードの次を削除するノードの次のノードとつなぎ合わせる
if (prev) prev->pNext = pNode->pNext;
// 先頭ノードが削除される場合は先頭ノードを次のノードに差し替える
if (pNode == pHead) pHead = pNode->pNext;
// 末尾のノードが削除される場合は手前のノードに差し替える
if (pNode == pTail) pTail = prev;
// メモリを解放する
free(pNode);
break;
}
// 手前のノードと現在のノードを進める
prev = temp;
temp = temp->pNext;
}
}
// ノードの作成
LinkedNode* CreateNode(int value)
{
// ノードのメモリを確保する
LinkedNode* pNode = (LinkedNode*)malloc(sizeof(LinkedNode));
// ノードの値を設定して次のノードを初期化
pNode->value = value;
pNode->pNext = NULL;
return pNode;
}
// ノードの削除
void DeleteAll(void)
{
// ノードが無くなるまで削除し続ける
while(pHead)
{
RemoveNode(pHead);
}
}
これでノードの追加や削除を行う基本の処理が出来ました。
では実際に追加や削除を行うテスト処理を作ってみましょう。
// ノードの実装テスト
void NodeTest(void)
{
// データの追加と削除のテスト
// 2, 5, 3, 1のデータを追加してから2のノードを削除する
LinkedNode* temp = CreateNode(2);
AddNode(temp);
AddNode(CreateNode(5));
AddNode(CreateNode(3));
AddNode(CreateNode(1));
RemoveNode(temp);
// 現在のノード内容を順番に表示する
LinkedNode* pNode = pHead;
while (pNode)
{
printf("Value:%d\n", pNode->value);
pNode = pNode->pNext;
}
// ノードを全て削除する
DeleteAll();
}
・実行結果
Value:5
Value:3
Value:1
このようにデータの追加と削除が行えます。