#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");
}
|