개발/C++

[C++] 링크드 리스트 (Linked List) 구현

hojak99 2017. 1. 1. 22:08

오랜만에 링크드 리스트를 다시 한 번 구현해보았다. 예전엔 C로 구현했는데 이번엔 C++ 로 구현해보았다.


1학년 때는 코딩을 지금처럼 열심히 하지 않았기에 끙끙대면서 구현했지만 지금 오랜만에 짜보니까 정말 쉬워서 내가 1학년 때 너무 놀았다는 것을 다시 한 번 깨달게 되었다.




/*
       node.h
*/
#pragma once
#include <iosteam>

class Node {
public :
	Node *nextNode = nullptr;

	int data;
};

class Link {
public :
	Node *head = new Node();

	void insert(int data);
	int getData(int nodeIndex);
	void deleteData(int nodeIndex);

	const void printData();
	const void printSize();

private:
	int cntSize = 0;
};

////////////////////////////////////////////////////////////////////////

void Link::insert(int data) 
{
	if (cntSize == 0) {
		head->data = data;
		head->nextNode = nullptr;
	}
	else {
		Node *currentNode = new Node();
		
		currentNode->data = data;
		currentNode->nextNode = nullptr;

		Node *tempNode = head;

		while (tempNode->nextNode != nullptr) {
			tempNode = tempNode->nextNode;
		}

		tempNode->nextNode = currentNode;
	}

	++cntSize;
}

const void Link::printData()
{
	Node *tempNode = head;

	for (int i = 0; i < cntSize; ++i) {
		std::cout << tempNode->data << std::endl;
		tempNode = tempNode->nextNode;
	}
}

const void Link::printSize()
{
	std::cout << "List Size = " << cntSize <= nodeIndex) {
		while (i != nodeIndex)
		{
			tempNode = tempNode->nextNode;
			
			++i;
		}
		std::cout << nodeIndex << " 의 값 : " << tempNode->data << std::endl;
		return tempNode->data;
	}
	else {
		std::cout << "잘못된 index를 입력하였습니다." << std::endl;
	}
}

void Link::deleteData(int nodeIndex)
{
	Node *tempNode = head;
	Node *deleteNode;
	Node *swapNode;
	
	if (nodeIndex != 0) {
		for (int i = 0; i < nodeIndex - 1; i++) {
			tempNode = tempNode->nextNode;
		}

		deleteNode = tempNode->nextNode;
		swapNode = deleteNode->nextNode;

		tempNode->nextNode = swapNode;
	}
	else {
		head = tempNode->nextNode;
		deleteNode = tempNode;
	}
	
	delete deleteNode;
	cntSize -= 1;
}






//main.cpp

#include "node.h"

int main()
{
	Link link;

	std::cout << "1. 데이터 추가      2. 모든 데이터 출력       3. 특정 노드의 데이터 출력      4. 노드 삭제      0. 종료" << std::endl;

	int click(0);
	

	while (true) {
		int data(0);
		std::cout << "\n메뉴 선택하세요 : ";
		std::cin >> click;

		switch (click)
		{
		case 1: {
			std::cout << "데이터 입력 : ";
			std::cin >> data;

			link.insert(data);
		}break;

		case 2: {
			std::cout <<"전체 노드 데이터"<< std::endl;
			link.printData();
		}break;

		case 3: {
			std::cout << "\n특정 노드 입력 : ";
			std::cin >> data;
			link.getData(data);
		}break;

		case 4: {
			std::cout << "\n삭제 노드 입력 : ";
			std::cin >> data;
			link.deleteData(data);
		} break;


		case 0: {
			return 0;
		}break;


		default: {
			return 0;
			break;
			}
		}
	}

	return 0;
}
반응형