C++/C++로 쉽게 풀어쓴 자료구조

C++로 쉽게 풀어쓴 자료구조 6장 연습문제

꾸준함. 2017. 10. 3. 00:44

[Node.h]

/*

1.단순 연결 리스트에 정수가 저장되어 있다. 단순 연결 리스트의 모든 데이터 값을 더한 합을 출력하는 프로그램을 작성한다

2. 단순 연결리스트에 특정한 데이터 값을 갖는 노드의 개수를 계산하는 함수를 작성한다

*/

#include <iostream>

using namespace std;

 

class Node

{

private:

        Node *link; //다음 노드를 가리키는 포인터 변수

        int data; //노드의 데이터 필드

public:

        Node(int val = 0) :data(val), link(NULL)

        {

        }

        int getData()

        {

               return data;

        }

        Node *getLink()

        {

               return link;

        }

        void setLink(Node *next)

        {

               link = next;

        }

        void display()

        {

               cout << "<" << data << "> ";

        }

        bool hasData(int val)

        {

               return data == val;

        }

 

        //자신의 다음에 새로운 노드 n을 삽입하는 함수

        void insertNext(Node *n)

        {

               if (n != NULL)

               {

                       n->link = link;

                       link = n;

               }

        }

        //자신의 다음 노드를 리스트에서 삭제하는 함수

        Node *removeNext()

        {

               Node *removed = link;

               if (removed != NULL)

                       link = removed->link;

               return removed;

        }

};


[LinkedList.h]

/*

단순 연결리스트 클래스

*/

#include "listNode.h"

class LinkedList

{

private:

        Node org; //헤드 노드(헤드 포인터 아님)

public:

        LinkedList() :org(0)

        {

        }

        ~LinkedList()

        {

               clear(); //소멸자

        }

        void clear()

        {

               while (!isEmpty())

                       delete remove(0);

        }

        Node *getHead()

        {

               return org.getLink();

        }

        bool isEmpty()

        {

               return getHead() == NULL;

        }

 

        //pos번째 항목을 반환

        Node *getEntry(int pos)

        {

               Node *n = &org;

               for (int i = -1; i < pos; i++, n = n->getLink())

                       if (n == NULL)

                              break;

               return n;

        }

        //리스트의 어떤 위치에 항목 삽입

        void insert(int pos, Node *n)

        {

               Node *prev = getEntry(pos - 1);

               if (prev != NULL)

                       prev->insertNext(n);

        }

        //리스트의 어떤 위치의 항목 삭제

        Node *remove(int pos)

        {

               Node *prev = getEntry(pos - 1);

               return prev->removeNext();

        }

        //탐색 함수

        Node *find(int val)

        {

               for (Node *p = getHead(); p != NULL; p = p->getLink())

                       if (p->hasData(val))

                              return p;

               return NULL;

        }

        //리스트의 어떤 위치에 항목 삽입

        void replace(int pos, Node *n)

        {

               Node *prev = getEntry(pos - 1);

               if (prev != NULL)

               {

                       delete prev->removeNext();

                       prev->insertNext(n);

               }

        }

        //리스트의 항목 개수를 반환

        int size()

        {

               int count = 0;

               for (Node *p = getHead(); p != NULL; p = p->getLink())

                       count++;

               return count;

        }

        //화면에 보기 좋게 출력

        void display()

        {

               cout << "[전체 항목 수 = " << size() << "] : ";

               for (Node *p = getHead(); p != NULL; p = p->getLink())

                       p->display();

               cout << endl;

        }

        //모든 데이터 값을 더한 합을 출력하는 함수

        void sum()

        {

               int Add = 0;

               cout << "[전체 항목의 합 = ";

               for (Node *p = getHead(); p != NULL; p = p->getLink())

                       Add += p->getData();

               cout << Add << "]" << endl;

        }

        //단순 연결 리스트에서 특정한 데이터 값을 갖는 노드의 개수를 계산하는 함수

        int count(int val)

        {

               int cnt = 0;

               for (Node *p = getHead(); p != NULL; p = p->getLink())

                       if (p->hasData(val))

                              cnt++;

               return cnt;

        }

};


[LinkedList.cpp]

/*

단순 연결리스트 테스트 프로그램

*/

#include "LinkedList.h"

 

int main(void)

{

        LinkedList list;

        list.insert(0, new Node(10));

        list.insert(0, new Node(20));

        list.insert(1, new Node(30));

        list.insert(list.size(), new Node(40));

        list.insert(2, new Node(50));

        list.display();

        list.sum();

        cout << "리스트 내 90을 갖고 있는 노드의 수: " << list.count(90) << endl;

        list.remove(2);

        list.remove(list.size() - 1);

        list.remove(0);

        list.replace(1, new Node(90));

        list.display();

        cout << "리스트 내 90을 갖고 있는 노드의 수: " << list.count(90) << endl;

        list.clear();

        list.display();

        return 0;

}


개발환경:Visual Studio 2017


지적, 조언, 질문 환영입니다! 댓글 남겨주세요~


[참고] C++로 쉽게 풀어쓴 자료구조

반응형