Computer Science

[자료구조] 체인

kk_eezz 2022. 5. 17. 10:53

Sequential Representation

succesive element is stored at fixed distance apart

Linked representation

 eash element is places anywhere in memory

 


Chain representation in C++

 

1. 체인 노드 클래스

template <class T>
class ChainNode {
    friend class Chain<T>;
private:
    T data;
    ChainNode<T> *link;
public:
    ChainNode(T value = "", ChainNode<T> *_link = NULL) { //생성자
        data = value;
        link = _link;
    }
};

 

2. 체인 클래스 데이터 멤버

template <class T>
class Chain {
private:
    ChainNode<T> *first;
    ChainNode<T> *second;
    ChainNode<T> *last;

 

3. 체인의 끝에 노드 삽입

void insertBack(const T& e){
    if(first) {
        last->link = new ChainNode<T>(e);
        last = last->link;
    }
    else makeChainNode(e);
}

 

4. 노드 삭제

void deleteChainNode(const T& e) {
    ChainNode<T> *cur = first;
    if(first->data == e) {
        if(first->link != NULL)
            first = new ChainNode<T>(first->link->data,first->link->link);
        else
            first = NULL;
    }
    while (cur->link != NULL) {
        if(cur->link->data) {
            cur->link = cur->link->link;
            return;
        }
    }
}

 

5. 전체 체인 클래스

template <class T>
class Chain {
private:
    ChainNode<T> *first;
    ChainNode<T> *second;
    ChainNode<T> *last;
 
public:
    Chain() { // 생성자
        first = NULL;
        second = NULL;
        last = NULL;
    }
    void makeChainNode(T value) {
        second = new ChainNode<T>(0, NULL);
        first = last = new ChainNode<T>(value, second);
    }
    void insert(const T& e, ChainNode<T> *x) {
        if(first)
            x->link = new ChainNode<T>(e,x->link);
        else
            makeChainNode(e);
    }
    void insertBack(const T& e){
        if(first) {
            last->link = new ChainNode<T>(e);
            last = last->link;
        }
        else makeChainNode(e);
    }

    void deleteChainNode(const T& e) {
        ChainNode<T> *cur = first;
        if(first->data == e) {
            if(first->link != NULL)
                first = new ChainNode<T>(first->link->data,first->link->link);
            else
                first = NULL;
        }
        while (cur->link != NULL) {
            if(cur->link->data) {
                cur->link = cur->link->link;
                return;
            }
        }
    }
    void print() {
        ChainNode<T> *cur = first;
        if(!first){
            cout << "노드를 생성하시오."<< endl;
            return;
        }
        while (cur!= last) {
            cout << cur->data << " ";
            cur = cur->link;
        }
        cout << last-> data << endl;
    }
    ChainNode<T>* getFirst(){ return first;}
    ChainNode<T>* getLink(ChainNode<T> *x){ return x->link;}
};

 

6. 전체 코드

#include <iostream>
 
using namespace std;

template <class T> class Chain;

template <class T>
class ChainNode {
    friend class Chain<T>;
private:
    T data;
    ChainNode<T> *link;
public:
    ChainNode(T value = "", ChainNode<T> *_link = NULL) { //생성자
        data = value;
        link = _link;
    }
};

template <class T>
class Chain {
private:
    ChainNode<T> *first;
    ChainNode<T> *second;
    ChainNode<T> *last;
 
public:
    Chain() { // 생성자
        first = NULL;
        second = NULL;
        last = NULL;
    }
    void makeChainNode(T value) {
        second = new ChainNode<T>(0, NULL);
        first = last = new ChainNode<T>(value, second);
    }
    void insert(const T& e, ChainNode<T> *x) {
        if(first)
            x->link = new ChainNode<T>(e,x->link);
        else
            makeChainNode(e);
    }
    void insertBack(const T& e){
        if(first) {
            last->link = new ChainNode<T>(e);
            last = last->link;
        }
        else makeChainNode(e);
    }

    void deleteChainNode(const T& e) {
        ChainNode<T> *cur = first;
        if(first->data == e) {
            if(first->link != NULL)
                first = new ChainNode<T>(first->link->data,first->link->link);
            else
                first = NULL;
        }
        while (cur->link != NULL) {
            if(cur->link->data) {
                cur->link = cur->link->link;
                return;
            }
        }
    }
    void print() {
        ChainNode<T> *cur = first;
        if(!first){
            cout << "노드를 생성하시오."<< endl;
            return;
        }
        while (cur!= last) {
            cout << cur->data << " ";
            cur = cur->link;
        }
        cout << last-> data << endl;
    }
    ChainNode<T>* getFirst(){ return first;}
    ChainNode<T>* getLink(ChainNode<T> *x){ return x->link;}
};
 
int main() {
    Chain<int> a;
    int value;
    int num;
 
    while(1) {
        cout << "노드 생성(1), 노드 삽입(2), 노드 확인(3), 노드 삭제(4), 종료(5)" << endl;
        cout << "번호 입력: ";
        cin >> num;
 
        switch(num) {
            case 1:
                cout << "노드 값 입력: ";
                cin >> value;
                a.makeChainNode(value);
                break;
            case 2:
                cout << "노드 값 입력: ";
                cin >> value;
                a.insertBack(value);
                break;
            case 3:
                a.print();
                break;
            case 4:
                cout << "어떤 노드?: ";
                cin >> value;
                a.deleteChainNode(value);
                break;
            case 5:
                return 0;
                break;
        }
    }
}