본문 바로가기

알고리즘까먹지말게

Single LinkedList 기초

자료구조 1주차 과제부터 다시 정리하려고~~ 시작!

1주차는 내가 싫어하는 포인터가 많은 ~ 링크드리스트 그중에서도 single, , 양방향이 더 빡쳤던 기억!

아직도 포인터 어쩌구 잘 이해 못함 ㅋㅋ

 


1.  이것만 알면 풀수있긴 함. .

node->value 현재의 노드가 저장한 값

node->next 다음 노드를 가리키는 주소

node->head 대가리 주소

아직도 포인터 -> 쓰는거 헷갈림.. 컴공자격 박탈!

자구 첫번째 과제였는데

싱글링크드리스트 삭제 대가리에삽입 지우기 대가리출력 전체출력 하기!

보너스 점수가 tail에 삽입이었는데,, 그땐 못했는데 ,, 이번엔 했다 ㅎㅎ ^_^,,,, //

#include<iostream>
using namespace std;


//day 1 single linkedlist

// 마지막->next = null 임 마지막임을 표시
//node, list 클라스는 내가 원래 썼던거 그대루 가져옴


//하나의 노드
class Node {

		friend class List;

	private:
		int value;
		string name;
		Node* next;
		
		Node(int v, string na, Node* n) {
			value = v;
			name = na;
			next = n;
		}

		Node() {
			value = 0;
			next = nullptr;
	}

	};

	//리스트
	class List {
		
	private:
		Node* head;
		Node* tail;
		int size;

	public:
		List(int, string);
		void insertHead(int, string);
		void insertTail(int, string);
		void removeHead();
		void isEmpty();
		void printHead(int, string);
		void printAll();
	};

	List::List(int value, string name)
	{
		head = tail = new Node(value, name, nullptr); // 하나의 싱글노드 가르키는게 ㄴㄴ
	}

	void List::insertHead(int value, string name) {
		Node* newNode = new Node(value, name, nullptr);

		if (head == nullptr)
		{
			tail = newNode;
			//head가 비었으면 하나의 싱글노드 시작 List 그냥 풀어놓은,,
		}
		else {
			//새로운 노드의 next가 기존의 head를 가르키게 해서 
			newNode->next = head;
		} 
		
		head = newNode;  //어쨌거나 새로운 노드가 head가 됨
	}


	void List::insertTail(int value, string name) {
		
		Node* newNode = new Node(value, name, nullptr);
		Node* node = head;
		
		if (node->next != NULL) {
			if (node->next != NULL) {
				while (node->next != tail) {
					node = node->next;
				}
			}
			newNode->next = tail;
			node->next = newNode;
		}
		else { // 첫노드라면 그냥 head이자 tail로
			newNode->next = head;
			head = newNode;
			
		}
		
	}

	void List::removeHead() {
		// 비었을때 error
		// empty가 아니면 next 했을때 존재
		
		Node* node = head;
		Node* temp;

		//뭔가있다면
		if (node->next != nullptr) {
		
			// temp를 head로 만들어주고 head는 계속 next 노드 가르키게
			temp = head;
			head = head->next; // head는 계속 next 가르키게
			delete temp; // head가 된 temp를 지워벌임
		
		}
		else {
			cout << "Invalid Removal" << endl;

		}
	}

	void List::isEmpty() {

		Node* node = head;
		if (node == nullptr) {
			
			cout << "T" << endl;
		}
		else {
			cout << "F" << endl;
		}


	}


	void List::printHead(int value, string name) {
	
		Node* node = head;


		if (node!= NULL) {
			cout << "(" << node->name << "," << node->value << ")" << endl;
		}
		else {
			cout << "Empty List" << endl;
		}

		//node = node->next; // node는 계속 next 노드를 가르키게
	}


	void List::printAll()
	{
		Node* node = head;

		//node의 끝까지
		if (node->next != NULL) {
			while (node != NULL) {
				
				if (node->next != NULL) {
					cout << "(" << node->name << "," << node->value << ")" << endl;
				}
				node = node->next;
			}
		}
		else {
			cout << "Empty List" << endl;
		}
		

	}
	int main()
	{
		char ch = 0;
		string name;
		int score = 0;
		List* list = new List(score, name);  //동적할당


		while (ch != 'X')  // X가 아닌동안
		{
			cin >> ch;

			switch (ch)
			{
			case 'I':
				cin >> name >> score;          // 입력장치 필요
				list->insertHead(score, name);
				break;
			case 'A':
				cin >> name >> score;
				list->insertTail(score, name);
				break;
			case 'R':
				list->removeHead();
				break;
			case 'E':
				list->isEmpty();
				break;
			case 'H':
				list->printHead(score, name);
				// Implement Head
				break;
			case 'T':
				list->printAll();
				break;
			case'X':
				return 0;  // X를 입력할 경우 프로그램 종료
			default:
				cout << "Wrong Input" << endl;
				break;
			}
		}
		return 0;

	}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'알고리즘까먹지말게' 카테고리의 다른 글

드디어 BFS/DFS 해보겠습니다.  (0) 2020.08.06
자료구조 이것저것 정리  (0) 2020.07.28
자구 4번째 과제(infix to postfix)  (0) 2020.07.28
STL Stack 이것저것 사용  (0) 2020.06.09
STL 간단 정리  (0) 2020.06.02