#include "..\CookHeader.h"

// 구조체 및 전역 변수 선언 부분
typedef struct _Node {
	int data;
	struct _Node* link = NULL;
} Node;

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

// 함수 선언 부분
void printNodes(Node* start) {
	if (start == NULL)
		return;
	Node* current = start;
	print(current->data);
	while (current->link != NULL) {
		current = current->link;
		print(current->data);
	}
	println("");
}

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

void makeLottoList(int num) {
	Node* node;
	node = new Node;
	node->data = num;
	memory.push_back(node);
	if (head == NULL) { // 첫 번째 노드일 때
		head = node;
		return;
	}
	if (head->data > num) {  //  첫 번째 노드보다 작을 때
		node->link = head;
		head = node;
		return;
	}
	
	current = head;  // 중간 모드로 삽입하는 경우
	while (current->link != NULL) {
		pre = current;
		current = current->link;
		if (current->data > num) {
			pre->link = node;
			node->link = current;
			return;
		}
	}
	
	current->link = node; // 삽입하는 노드가 가장 큰 경우
} 

bool findNumber(int num) {
	if (head == NULL)
		return false;
	current = head;
	if (current->data == num)
		return true;

	while (current->link != NULL) {
		current = current->link;
		if (current->data == num) {
			return true;
		}
	}
	return false;
}

// 메인 코드 부분
int main() {
	int lottoCount = 0;
	int lotto;

	randomInit(1, 45);
	while (true) {
		lotto = cookRandom(gen);
		if (findNumber(lotto))
			continue;
		lottoCount++;
		makeLottoList(lotto);
		if (lottoCount >= 6)
			break;
	}
	printNodes(head);
	freeMemory();
}