リスト構造の生成と挿入と削除

Listing. 1: リスト作ってつないで挿入して削除
"theMain.cpp"
#include <iostream>
 
namespace
{
	const int DATASIZE = 5;//生成するデータ数
}
 
 
struct Point
{
	int x;
	int y;
};
 
struct myList
{
	Point pos;
	int num; //データ1個作ったら勝手に増えてほしい
	myList* pNext;
};
 
void InsertData(myList *head, int num, myList* data) //numの後ろにデータdataを挿入
{
	myList* p = head;
	while (p != nullptr)
	{
		if (p->num == num)
		{
			myList* tmp = p->pNext;
			p->pNext = data;
			data->pNext = tmp;
			break;
		}
		else
			p = p->pNext;
	}
	return;
}
void InsertData(myList* head, int num, int x, int y) //numの後ろにデータdataを挿入
{
 
}
 
myList* makeData(int x, int y)
{
	static int numData = 0;
	myList* pData = new myList;
	pData->pos = { x, y };
	pData->num = numData;
	pData->pNext = nullptr;
	numData++;
	return(pData);
}
 
void PrintList(myList* head)
{
	myList* p = head;
	while (p != nullptr)
	{
		std::cout << p->num << ": (" << p->pos.x << ", " << p->pos.y << ")" << std::endl;
		p = p->pNext;
	}
}
 
int main()
{
	myList* head = nullptr;
	myList* preP = nullptr;
	//myList* head = makeData(0, 0);
	for (int i = 0; i < DATASIZE; i++)
	{
		Point tmpP{ rand() % 10, rand() % 10 };
		myList* p = makeData(tmpP.x, tmpP.y);
		if (p->num == 0)
			head = p;
		else
			preP->pNext = p;
 
		preP = p;
	}
	std::cout << "挿入前" << std::endl;
	PrintList(head);
 
	myList* newData = makeData(-1, -1);
	InsertData(head, 2, newData);
	std::cout << "挿入後" << std::endl;
	PrintList(head);
	return 0;
}

追加削除できるやつ(メモリも開放するよ)

Listing. 2: リストの追加と削除とメモリ消去
"theMain.cpp"
#include <iostream>
 
namespace
{
	const int DATASIZE = 5;//生成するデータ数
}
 
 
struct Point
{
	int x;
	int y;
};
 
struct myList
{
	Point pos;
	int num; //データ1個作ったら勝手に増えてほしい
	myList* pNext;
};
 
//関数のプロトタイプ宣言
void InsertData(myList* head, int num, myList* data);
void InsertData(myList* head, int num, int x, int y);
void DeleteData(myList* head, int num);
void DelateData(myList* head, int x, int y);
myList* makeData(int x, int y);
void PrintList(myList* head);
 
//関数の定義たち
void InsertData(myList *head, int num, myList* data) //numの後ろにデータdataを挿入
{
	myList* p = head;
	while (p != nullptr)
	{
		if (p->num == num)
		{
			myList* tmp = p->pNext;
			p->pNext = data;
			data->pNext = tmp;
			break;
		}
		else
			p = p->pNext;
	}
	return;
}
void InsertData(myList* head, int num, int x, int y) //numの後ろにデータdataを挿入
{
	myList* p = head;
	while (p != nullptr)
	{
		if (p->num == num)
		{
			myList* data = makeData(x, y);
			myList* tmp = p->pNext;
			p->pNext = data;
			data->pNext = tmp;
			break;
		}
		else
			p = p->pNext;
	}
	return;
}
 
//データが見つかれば削除
void DeleteData(myList* head, int num)
{
	myList* p = head;
	myList* pre = nullptr;
	myList* delData = nullptr;
	while (p != nullptr)
	{
		if (p->num == num)
		{
			if (p == head)
			{
				delData = head;
				*head = *(p->pNext);
			}
			else
			{
				delData = p;
				pre->pNext = p->pNext;
			}
			break;
		}
		else
			pre = p;
			p = p->pNext;
	}
 
	delete delData;
	return;
}
 
//データが見つかれば削除
void DelateData(myList* head, int x, int y)
{
 
}
 
myList* makeData(int x, int y)
{
	static int numData = 0;
	myList* pData = new myList;
	pData->pos = { x, y };
	pData->num = numData;
	pData->pNext = nullptr;
	numData++;
	return(pData);
}
 
void PrintList(myList* head)
{
	myList* p = head;
	while (p != nullptr)
	{
		std::cout << p->num << ": (" << p->pos.x << ", " << p->pos.y << ")" << std::endl;
		p = p->pNext;
	}
}
 
 
int main()
{
	myList* head = nullptr;
	myList* preP = nullptr;
	//myList* head = makeData(0, 0);
	for (int i = 0; i < DATASIZE; i++)
	{
		Point tmpP{ rand() % 10, rand() % 10 };
		myList* p = makeData(tmpP.x, tmpP.y);
		if (p->num == 0)
			head = p;
		else
			preP->pNext = p;
 
		preP = p;
	}
	std::cout << "挿入前" << std::endl;
	PrintList(head);
 
	myList* newData = makeData(-1, -1);
	InsertData(head, 2, newData);
	std::cout << "挿入後" << std::endl;
	PrintList(head);
 
	std::cout << "削除後" << std::endl;
	DeleteData(head, 3);
	PrintList(head);
	int N = 6;
	while (true)
	{
		myList* newData = makeData(-1, -1);
		InsertData(head, 2, newData);
		DeleteData(head, N);
		N++;
 
	}
 
	return 0;
}