ロビーサーバーとネットワークに使われるデータ構造の

ロビーサーバーとネット
ワークに使われるデータ
構造の構築
ノードライブラリとキューの構築
04a1016
大嶽 優
データ構造論
► データ構造とは、使用するデータの形態を定義
し、扱う方法という意味 である。
► サーバーでは多くのデータが行き来し、管理し
なくてはならないので効率的なデータ構造が必
要不可欠である。
連結リストとノード
Node1
Node2
link
Node3
link
Node4
link
Node5
link
・データが連結されて、鎖のようにつながったものを定義します
・ノードはデータの最小最小単位であり、リンクでつながれているとします。
・メモリ構造ではなくそれぞれに付加されたアドレスによって連結される。
スタックとキュー
s4
s3
●スタック
LIFO(last Input First Out)構造
s2
s1
s4
s3
s2
s1
●キュー
FIFO(First Input First Out)構造
ノードライブラリ
struct NODE
{
void
int
NODE
NODE
};
*data;
size;
*prv;
*next;
date:データの内容
size:データのサイズ、チェックなどに使える
prv:前のノードのポインタ
next:後のノードのポインタ
ノード生成
ノードにメモリ割り当て
ノードがNULLか
N
ノード初期化
次のノードとリンク
前のノード
ノードリターン
Y
終了
ノードを連結から取り出す
Y
前と次のノードがNULLか?
終了
N
前のノードがNULLか?
Y
N
Prvの次のノードにNextを連結
一番前のノードを検索
NEXTノードが
NULLか?
N
NextのPrvに連結
一番前のノードをリターン
Y
ノードの間に1つのノードを挿入
Y
引数ノードのNEXT,
PrvをNULLに指定
前のノードが
NULLか?
N
次のノードに前のノードの
NEXTを指定
前のノードのNEXTに
引数ノードを指定
Y
次のノードが
NULLか?
N
次のノードのPRVに
引数ノードを指定
引数ノードのNEXTに次のノードを指定
引数ノードのPrvに前のNEXTを指定
キューライブラリ
キューの設計
struct QUEUE
{
NODE
NODE
int
};
*head;
*tail;
count;
Head:キューの連結リストの先頭のノードへのポインタ
Tail:末尾のノードへのポインタ
Int:ノードの個数(誤り検出用
キューのリセット関数
キューがNULLか?
終了
N
Y
キューカウンタ
>0か?
キューの先頭が
NULLか?
Y
N
次のノードを先頭ノードの
Nextに指定
キューカウンタを0に指定
先頭ノードリセット
終了
N
先頭ノード解除
キューカウンタ
<0ならば
Y
キューの先頭をNextに
キューカウンタ=0
キューカウンタ-1
終了
キューの末尾をNULL指定
キューに1つのノードを挿入
N
キューの末尾と
先頭がNULLか?
キューの末尾がNULL
ではなく、先頭がNULLか?
キューの末尾のノード検索
Y
キューの先頭
ノード検索
N
ノード生成
Y
ノードが
NULLか?
終了
N
Y
キューの先頭が
NULLか?
N
N
データがあるか?
Y
ノードにデータコピー
キューカウンタ++
生成されたノードを
先頭に指定
ノードのデータを
NULLに指定
キューの最初のノードをピック
Y
キューがNULLか?
終了
N
ノードの戻り値に
キューの先頭を指定
N
キューの先頭が
NULLか?
Y
ノードの戻り値は先頭ノード、
キューの先頭は戻り値を指定
Y
ノードの戻り値が
NULLか?
N
Y
キューの末尾と先頭を
NULLに指定
キューの末尾が
ノードの戻り値か?
N
キューカウンター1
ノードリターン
キューの先頭ノード指定
動作テスト
► キューから先頭ノードをピックする関数とデータ
をピックする関数をテストする。
► 1000000個のデータを格納し、110000個の
データを出力する。
► 正確性を確かめるためにテキストデータで出力
し、確認する。
まとめ
► データ構造は、考えは簡単だが設計するとなる
と構造化や一般化が非常に難しいことがわ
かった。
► ポインタを多用するため、十分なテストを行わ
ないと思いがけないエラーが出てくる可能性が
ある。
► 今回のライブラリを生かせるようなデータベー
スとの連携をする方法も考えたい。