#include "..\CookHeader.h"

// 구조체 및 전역 변수 선언 부분
typedef struct _Node {
	string data[2]; // 이름, 이메일
	struct _Node* link = NULL;
} Node2;

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

// 함수 선언 부분
void printNodes2(Node2* start) {
	if (start == NULL)
		return;
	Node2* current = start;
	print("[" + current->data[0] + "," + current->data[1] + "]");
	while (current->link != NULL) {
		current = current->link;
		print("[" + current->data[0] + "," + current->data[1] + "]");
	}
	println("");
}

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

void makeSimpleLInkedList(Array <string> nameEmail) {
	Node2* node;
	node = new Node2;
	node->data[0] = nameEmail[0];
	node->data[1] = nameEmail[1];
	memory.push_back(node);
	if (head == NULL) {						// 첫 번째 노드일 때
		head = node;
		return;
	}
	if (head->data[1] > nameEmail[1]) {		// 첫 번째 노드보다 작을 때
		node->link = head;
		head = node;
		return;
	}
	
	current = head;			// 중간 모드로 삽입하는 경우
	while (current->link != NULL) {
		pre = current;
		current = current->link;
		if (current->data[0] > nameEmail[0]) {
			pre->link = node;
			node->link = current;
			return;
		}
	}
	
	current->link = node;	// 삽입하는 노드가 가장 큰 경우
}

// 메인 코드 부분
int main() {

	string name, email;
	while (true) {
		input(name, "이름-->");
		if (name == "x" || name == "X")
			break;
		input(email, "이메일-->");
		makeSimpleLInkedList({ name, email });
		printNodes2(head);
	}

	freeMemory();
}