//Megat Irfan Zackry Bin Ismail
//A20EC0205
//LList

#include <iostream>
using namespace std;

struct stud{
	string name;
	int age;
	stud *next=NULL;
};

class LList{

	private:
		stud *head;
//		stud *tail;
	public:
		LList();
		~LList();
		void displayList();
		bool isEmpty();
		stud *insertNodeOrder(string n, int age);
		int deleteNode(string n);
		int findNode(string n);
};

void LList::displayList(){
	if (isEmpty()){
		cout<<"\nEmpty, cant print";
	}
	else{
		stud *ptr = head;
		while(ptr!=NULL){
			cout<<"\nname : "<<ptr->name;
			cout<<"\nage : "<<ptr->age;
			cout<<"\nnect : "<<ptr->next;
			ptr=ptr->next;
		}
	}
}
LList::LList(){
	head = NULL;
}
		
LList::~LList(){
	
}

bool LList::isEmpty(){
	/*if (head==NULL){
		return true
	}
	else{
		return false;
	} */
	return (head==NULL);
}

stud* LList::insertNodeOrder(string n, int a){
	
	int currIndex = 0;
		stud* currNode = head;
		stud* prevNode = NULL;
		while (currNode && n > currNode->name) {
			prevNode = currNode;
			currNode = currNode->next;
			currIndex++;
		}
	stud *newNode = new stud;
	newNode->name = n;
    newNode->age =a;
	
	if (currIndex == 0) {
		newNode->next = head;
		head = newNode;
	}
	else {
		newNode->next = prevNode->next;
		prevNode->next = newNode;
	}
	return newNode;
}

int LList::deleteNode(string n){
	if (isEmpty()){
		cout<<"\n\nunable to delete empty list";
	}
	else{
		stud* prevNode = NULL;	
		stud* currNode = head;
		int currIndex = 1;
		while (currNode && currNode->name != n) {
			prevNode = currNode;
			currNode = currNode->next;
			currIndex++;
			}
		
		if (currNode) {
			if (prevNode) {
				prevNode->next = currNode->next;
				delete currNode;
				}
			else {
				head = currNode->next;
				delete currNode;
				}
			return currIndex;
			}
	}
	return 0;
}

int LList::findNode(string n){
	stud* ptr = head;
	int currIndex = 1;
	while (ptr && ptr->name != n) {
		ptr = ptr->next;
		currIndex++;
		}
	if (ptr){
		cout << "\nname	: "<< ptr->name;
		cout << "\nage	: "<< ptr->age;
	}	
}

int main(int argc, char** argv) {
	LList *ll = new LList;
	cout<<"Is ll empty? :"<<ll->isEmpty();
	ll->displayList();

	ll->insertNodeOrder("SIME",45);
	ll->insertNodeOrder("ZACK",33);
	ll->insertNodeOrder("ALI",21);
	ll->insertNodeOrder("IZALI",21);
	ll->insertNodeOrder("ERNI",21);
	ll->insertNodeOrder("BIBI",21);
	ll->insertNodeOrder("NIA",21);
	
	ll->displayList();
	
	cout<<"\nIs ll empty? :"<<ll->isEmpty();
	
	ll->deleteNode("ALI");
	
	ll->findNode("IZALI");
	
	

	return 0;
}
