본문 바로가기
Algorithm/C & C++

C++ 링크드리스트 클래스 구현 및 소스코드

by 평범한 개발자... 2016. 1. 21.
예전에 C로만 링크드리스트를 코딩한 적이 있었는데, 한번 C++ 로 클래스로 만들어서 구현해봐야겠다. 라는 생각이 들어서 막 짜보았습니다. 성능적인 부분에 있어서 STL과 비교했을때 느리거나 비효율적일진 모르겠지만, 기능적인 부분에 있어서는 오작동 없이 매우 잘 됩니다.
 
메소드 기능과 이름은 Java에서 사용하는 List와 동일하게 사용했습니다.

아래 클래스를 간단하게 설명하자면, List 클래스 안에 Node라는 내부 클래스를 선언했고, 리스트에 접근하기 위한 Head 노드를 멤버 변수로 선언하여 동적 할당 합니다. 그리고 각종 예외처리 하기 위해 유효성을 검증하는 valid함수를 구현했습니다.

 

클래스
#pragma once
class List
{
private:
	class Node
	{
	public:
		int data;
		Node* nextNode;
	};

	void valid(int count); //예외처리를 하기 위한 함수 (사용자 함수 X)
	int count;	//리스트의 크기를 저장할 변수
	Node* Head = new Node; // Head 노드

public:
	List(); //생성자
	/*
		List 함수 목록
	*/
	int get(int index);	//해당 index 데이터 출력
	void add(int data); //맨 앞에 새로운 노드 추가 
	void add(int index, int data); //해당 index에 새로운 노드 추가
	int size();	// List의 길이를 리턴함
	void set(int index, int data);	//데이터 값 변경
	void remove(int index); //해당 index 삭제
	bool isEmpty();	//객체가 비어있는지 확인
};

 


 

리스트 메소드 소스

#include <iostream>
#include <iostream>
#include "List.h"

using namespace std;

List::List()
{
	Head->nextNode = NULL;
	List::count = 0;
}

int List::get(int index)
{
	try
	{
		valid(index);
	}
	catch (const char* msg)
	{
		cout << msg << endl;
		return -1;
	}

	Node* temp = Head;;
	for (int i = 0; i <= index; i++){
		temp = temp->nextNode;
	}
	return temp->data;
}

void List::valid(int count)
{
	if (count > List::count)
	{
		throw "Error : 유효하지 않은 index 입니다.";
	}
}

int List::size()
{
	return List::count;
}

void List::add(int data)
{
	Node* NewNode = new Node;
	NewNode->data = data;
	NewNode->nextNode = NULL;

	if (Head->nextNode == NULL)
	{
		Head->nextNode = NewNode;
	}
	else
	{
		Node* temp = Head;
		while (temp->nextNode != NULL)
		{
			temp = temp->nextNode;
		}
		temp->nextNode = NewNode;
	}

	List::count++;
}

void List::add(int index, int data)
{
	try
	{
		valid(index);
	}
	catch (const char* msg)
	{
		cout << msg << endl;
		return;
	}

	Node* NewNode = new Node;
	NewNode->data = data;
	NewNode->nextNode = NULL;

	if (Head->nextNode == NULL)
	{
		Head->nextNode = NewNode;
	}
	else
	{
		Node* temp = Head;
		for (int i = 0; i < Count; i++)
		{
			temp = temp->nextNode;
		}
		NewNode->nextNode = temp->nextNode;
		temp->nextNode = NewNode;
	}

	List::count++;
}

void List::set(int index, int data)
{
	try
	{
		valid(index);
	}
	catch (const char* msg)
	{
		cout << msg << endl;
		return;
	}

	Node* temp = Head;
	for (int i = 0; i <= index; i++)
	{
		temp = temp->nextNode;
	}

	temp->data = data;
}

void List::remove(int index)
{
	try
	{
		valid(index);
	}
	catch (const char* msg)
	{
		cout << msg << endl;
		return;
	}

	Node* temp = Head;
	Node* remove = Head;

	for (int i = 0; i < index; i++)
	{
		temp = temp->nextNode;
		remove = remove->nextNode;
	}
	remove = remove->nextNode;

	temp->nextNode = remove->nextNode;
	remove->nextNode = NULL;
	delete remove;
	List::count--;
}

bool List::isEmpty()
{
	Node* head = Head;
	if (head->nextNode == NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

 

 

리스트 테스트 (메인함수)

#include "List.h"
#include <iostream>
using namespace std;

int main()
{
	List test;
	
	test.add(10);
	test.add(20);
	test.add(30);
	test.add(3, 40);
	test.remove(0);
	test.set(0, 100);

	for (int i = 0; i < test.size() ; i++)
	{
		cout<<"data : " << test.get(i) << endl;
	}


	cout << "size : " << test.size() <<endl;
	cout << "isEmpty : " << test.isEmpty() << endl;

	test.remove(10);
	return 0;
}

 

 

결과 화면

 

 

반응형

댓글