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

Back Next
更新日 2004.01.18
リスト構造 3

 今回はリスト構造のまとめで、リストに追加と削除をやってみます。


サンプルコード

#include	<stdio.h>


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


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


void PushBack(tagData *p);
tagData * EraseNext(tagData *p);
void Clear(void);
void Print(void);


void main(void)
{
	tagData	*p;

	printf("●最初\n");
	Print();	// ディスプレイに表示


	p = new tagData;

	p->nXPos = 10;
	p->nYPos = 20;

	PushBack(p);

	printf("●1つ追加\n");
	Print();	// ディスプレイに表示


	p = new tagData;

	p->nXPos = 30;
	p->nYPos = 60;

	PushBack(p);

	printf("●もう1つ追加\n");
	Print();	// ディスプレイに表示


	// x座標が 30 のデータをリストから削除する
	p = g_pHead;
	while(p != NULL)
	{
		if(p->nXPos == 30)
			p = EraseNext(p);
		else
			p = p->pNext;
	}

	printf("●削除した後\n");
	Print();	// ディスプレイに表示


	Clear();	// リストを空にする

	printf("●すべて削除した後\n");
	Print();	// ディスプレイに表示
}


// 最後尾にくっつける
// 引数 : 入れるポインタ
// 戻値 : なし
void PushBack(tagData *p)
{
	if(!g_pHead)
		g_pHead = p;
	if(g_pTail)
		g_pTail->pNext = p;
	p->pBefore = g_pTail;
	p->pNext = NULL;
	g_pTail = p;
}


// 削除して次のポインタを返す
// 引数 : 削除するポインタ
// 戻値 : 次のポインタ
tagData * EraseNext(tagData *p)
{
	tagData	*pReturn = p->pNext;
	if(p->pBefore)
		p->pBefore->pNext = pReturn;
	else
		g_pHead = pReturn;
	if(pReturn)
		pReturn->pBefore = p->pBefore;
	else
		g_pTail = p->pBefore;
	delete p;
	return pReturn;
}


// リストを空にする
// 引数、戻値 : なし
void Clear(void)
{
	tagData	*p, *pNext;
	pNext = g_pHead;

	while(pNext)
	{
		p = pNext;
		pNext = p->pNext;
		delete p;
	}

	g_pHead = g_pTail = NULL;
}


// ディスプレイに表示
// 引数、戻値 : なし
void Print(void)
{
	if(!g_pHead)
	{
		printf("リストは空です。\n\n");
		return;
	}


	tagData	*p = g_pHead;

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

実行結果
●最初
リストは空です。

●1つ追加
x = 10  y = 20

●もう1つ追加
x = 10  y = 20
x = 30  y = 60

●削除した後
x = 10  y = 20

●すべて削除した後
リストは空です。


 このプログラムを図で表すと以下のようになっています。




 サンプルが大分長くなってしまい、分かりにくくなっているかも知れませんが、解析してみて下さい。上のプログラムは、あくまで一例です。

【スポンサード リンク】


Back Next

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