#include "..\CookHeader.h"

typedef struct _Store {		// 편의점 구조체
	char storeName;
	int x;
	int y;
} Store;

typedef struct _StoreNode {	// 편의점 노드 구조체
	Store store;
	struct _StoreNode * link = NULL;
} StoreNode;

Array <StoreNode*> memory;
StoreNode* head, * current, * pre;

void printStores(StoreNode* start) {
	current = start;
	if (current == NULL)
		return;

	current = start;
	int x = current->store.x;
	int y = current->store.y;
	print(current->store.storeName);
	print("편의점 거리: ");
	println(to_string(sqrt(x * x + y * y)));

	while (current->link != head) {
		current = current->link;
		x = current->store.x;
		y = current->store.y;
		print(current->store.storeName);
		print("편의점 거리: ");
		println(to_string(sqrt(x * x + y * y)) );
	}
	println("");
}

void freeMemory() {	// 할당된 모든 노드의 메모리를 해제한다.
	for (int i = 0; i < len(memory); i++)
		delete memory[i];
}

void makeStoreList(Store store) {
	StoreNode* node = new StoreNode;
	node->store = store;
	memory.push_back(node);

	if (head == NULL) { // 첫 번째 편의점
		head = node;
		node->link = head;
		return;
	}

	// 새 편의점이 첫 번째 편의점보다 가까우면 첫 편의점으로 만듦
	int nodeX = node->store.x;
	int nodeY = node->store.y;
	int nodeDist = (int)sqrt(nodeX * nodeX + nodeY * nodeY);
	int headX = head->store.x;
	int headY = head->store.y;
	int headDist = (int)sqrt(headX * headX + headY * headY);

	if (headDist > nodeDist) {		// 헤드 앞에 삽입 
		node->link = head;
		StoreNode* last = head;
		while (last->link != head)	// 마지막 편의점 찾기
			last = last->link;
		last->link = node;
		head = node;
		return;
	}
	// 편의점을 중간에 넣을 경우
	current = head;
	while (current->link != head) {
		pre = current;
		current = current->link;
		int currX = current->store.x;
		int currY = current->store.y;
		int currDist = (int)sqrt(currX * currX + currY * currY);
		if (currDist > nodeDist) {
			pre->link = node;
			node->link = current;
			return;
		}
	}
	// 편의점을 마지막에 추가할 경우
	current->link = node;
	node->link = head;
}

int main() {
	randomInit(1, 100);
	Array <Store> storeArray;	

	char storeName = 'A';
	for (int i = 0; i < 10; i++) {
		int x = cookRandom(gen);
		int y = cookRandom(gen);
		Store s = { storeName, x, y };
		storeArray.push_back(s);
		storeName++; // A -> B -> C ...
	}

	for (int i = 0; i < len(storeArray); i++) {
		Store s = storeArray[i];
		makeStoreList(s);
	}
	printStores(head);

	freeMemory();
}