목록Programing/자료구조 (18)
공부중
이번에 설명하고자 하는 자료는 스택(Stack)이다. 스택은 한 문장으로 표현하면 "먼저 들어간 것이 나중에 나온다." 위 문장대로 스택은 후입선출(後入先出)또는 LIFO(Last-In, First-Out)의 자료구조라고 불린다. 이러한 스택의 구조는 우리 주변에서 많이 살펴볼 수 있다. 이러한 프링글스라던가.. 이런 장난감 같은 경우도 스택구조이다. 먼저 배열기반으로 구현해보았다. Candy.h#pragma once enum eCandy { eRed = 1, eGreen, eBlack, }; class Candy { public: Candy(); ~Candy(); virtual void TasteCandy() = 0; virtual void SeeCandy() = 0; private: }; class ..
양방향 연결리스트 혹은 이중 연결 링크드 리스트 라고 불리는 이 자료구조는 이름 그대로 양방향성을 띄는 구조이다. 한가지 방향성을 가진 모습이 이러 하였다면.. 양방향 연결리스트는 이렇게 양방향성을 가지고 있다. 이렇게 양방향성을 가지면서 한방향성보다 더욱 편리하게 이용할 수 있다. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveData; Node *Prev; Node *Next; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
원형 연결리스트는 말 그대로 원형으로 구조가 되어있는 연결리스트이다. 예를 들자면 이러한 구조가 될 것 같다. 계속 끝없이 순환 하는 연결리스트이다.ss 앞에서 만들었던 연결리스트의 마지막 노드가 맨 앞의 노드를 가리키면 뱀이 꼬리를 물 듯 원형의 모양이 자연스레 나오게 된다. 나름 원형 리스트를 새로 짜본다고 만들어 본거지만 뭔가 찜찜함은 여전하다.. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; Node *Next; int nSaveData; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
이전 글에 이어서 이번에는 데이터 조회를 살펴보자. NodeManager.cpp - void CNodeManager::PrintNode() void CNodeManager::PrintNode() { if( NULL == Head ) { std::cout
앞 글에서 나온 소스를 설명 해보고자 한다. 먼저 앞의 소스코드에서 데이터를 담을 때 마다 동적으로 메모리를 잡아주고 필요 없을 시 삭제하고 하였다. 이것을 간단한 비유를 들어보자. Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveNUM; Node *Next; };이 Node클래스를 화물 컨테이너에 비유를 해보자. 직접 그림을 그리긴 했지만 .. 기차가 맞으니 오해는 없길 바랍니다. 화물 컨테이너가 하나도 없을 때 기차의 모습은 이러할 것이다. 여기에 화물이 1개가 추가 되었을 때 이러한 모습일 것이다. 그리고 컨테이너 안에는 데이터가 들어가 있을 것이다. 또한 이 기차는..
앞 글에서 문제가 된 정적인 배열로는 필요로 하는 메모리 크기에 대해서 바로 바로 대처가 불가능했다. 그러한 문제 해결로 동적인 메모리 구성으로 된 소스를 보자 구조는 다음과 같다 소스코드 Node.h#pragma once class Node { public: Node(); ~Node(); private: friend class CNodeManager; int nSaveNUM; Node *Next; };Node.cpp#include #include "Node.h" Node::Node() { std::cout
앞 글 에서도 보았듯이 배열 기반의 리스트의 특징은 다음과 같다. 데이터의 참조가 쉽다 – 인덱스 값을 기준으로 어디든지 한번에 참조 가능 배열의 길이는 초기에 결정 되어야 한다. – 프로그램 실행 도중 크기 변경이 불가능 하다. 삭제의 과정에서 데이터의 이동 및 복사가 자주 일어난다 – 삭제하고 빈 곳을 없애기 위한 정렬 그리고 실수로 일어날 크나큰 문제는 다음 소스코드를 보자. main.cpp#include const int MAX_ARRAY = 5; int main() { int nTestArray[MAX_ARRAY] = {0}; static int nCount = 0; int nGetNUM = 0; std::cout
순차리스트(배열을 기반으로 구성된 리스트)를 한번 짜보앗는데.. 생각보다 엄청 오래걸렸다… 계속 짜서 코딩 실력좀 올려야 겟다 ㅠ.. 배열로 된 리스트를 구성할 예정이고 그 배열 안에 동물객체를 넣어서 관리하는걸 짜보려고 한다. 구조는 아래의 그림과 같다. 소스코드 ArrayManager.h#pragma once #include "Animal.h" enum eChoiceMenu { eFirst=-1, eAdd = 1, eDel = 2, ePrint = 3, eExit = 4, eOther, }; class CArrayManager { public: CArrayManager(); ~CArrayManager(); int Start(); int Choice(); void Add( ); void Del( ); ..