0からのゲームプログラミング > リスト構造 2

Back Next
更新日 2004.01.11
リスト構造 2

 それでは、リスト構造の具体的なサンプルを示します。簡単のために、コンソールプログラミングに戻ります。


サンプルコード

#include	<stdio.h>


struct tagData{
	tagData	*pBefore;	// 逆ポインタ
	tagData	*pNext;		// 順ポインタ
	int		nXPos;		// X座標
	int		nYPos;		// Y座標
};


tagData	*g_pHead = NULL;	// 先頭
tagData	*g_pTail = NULL;	// 最後尾


void Print(void);


void main(void)
{
	// メモリを確保
	tagData	data[3];

	data[0].nXPos = 100;
	data[0].nYPos = 110;
	data[1].nXPos = 200;
	data[1].nYPos = 210;
	data[2].nXPos = 300;
	data[2].nYPos = 310;


	// チェインでつなぐ

	g_pHead = &data[0];

	data[0].pBefore = NULL;
	data[0].pNext = &data[1];
	data[1].pBefore = &data[0];
	data[1].pNext = &data[2];
	data[2].pBefore = &data[1];
	data[2].pNext = NULL;

	g_pTail = &data[2];


	Print();	// ディスプレイに表示
}


// ディスプレイに表示
// 引数、戻値 : なし
void Print(void)
{
	tagData	*p = g_pHead;

	while(p != NULL)
	{
		printf("x = %d  y = %d\n", p->nXPos, p->nYPos);
		p = p->pNext;
	}
}

実行結果
x = 100  y = 110
x = 200  y = 210
x = 300  y = 310


 上のコードには、tagData という構造体があります。自機の弾を想定しているため、とりあえずx座標とy座標をメンバに持っています。さらに、その構造体には、同じ名前の構造体のポインタ pBefore, pNext を持っています。

 main 関数を見ると、tagData 構造体の配列を3つ用意し、x座標とy座標に値を代入しています。また、簡単のために new を使っていません。

 そして、それぞれをチェインでつないでいます。NULL は何も指していないという目印にしています。リストの先頭と最後尾が分かるように、g_pHead と g_pTail で指しています。図で表すと以下のようになります。
 

 上のリスト構造は、前から後ろにも、後ろから前にも、双方向にたどることが出来るので、双方向リストとも呼ばれています。

 次回は、new と delete を使って、追加と削除が出来るように、もう少し汎用的に書きたいと思います。

【スポンサード リンク】


Back Next

0からのゲームプログラミング > リスト構造 2