오랜만에 링크드 리스트를 다시 한 번 구현해보았다. 예전엔 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;
}
반응형