C , C++, C#

[자료구조] 링크드 리스트(C++)

vhxpffltm 2019. 2. 20. 22:42

C++ 역시 C언어로 구현한 링크드리스트와 비슷하다. 


이전에도 말했듯이 아주 중요한 구조이다.


1
2
3
4
5
typedef struct Node {
    int val;
    Node *next;
}node;
 
cs


그렇다면 C++클래스로 어떻게 적용시킬까? 이전 게시물에서 간단하게 표현하였지만, 실제 적용되는 구조를 알아보자


1
2
3
4
5
6
7
8
9
10
11
typedef struct Node {
    int val;
    Node *next;
}node;
 
class list {
private:
    node* head; // 첫 노드 
    node* tail; // 마지막 노드
    node* New; // 노드 생성용
    node* pos; // 확인용(이동)
cs


이렇게 클래스 맴버변수에 node포인터 타입을 가지도록 한다. 각 node포인터의 역할을 주석으로 표현하였다.


그리고 이전에서 진행한 노드 생성과 출력을 포함하여 삽입과 삭제연산을 수행해보자


이와같이 구조체를 맴버변수로 갖는 클래스를 형성하여 관리한다면 쉽게 연결리스트를 활용할 수 있다.


삭제연산에서 꼭 2개의 node포인터를 사용해서 연산을 이용해야 한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#include<iostream>
 
using namespace std;
 
typedef struct Node {
    int val;
    Node *next;
}node;
 
class list {
private:
    node* head; // 첫 노드 
    node* tail; // 마지막 노드
    node* New; // 노드 생성용
    node* pos; // 확인용(이동)
public:
    list() {
        head = tail = New = pos = NULL;
    }
 
    void create(int val) {
        New = new node;
        New->val = val;
        New->next = NULL;                //노드생성
        if (head == NULL) head = New;    //초기 노드
        else tail->next = New;           
 
        tail = New;
    }
 
    void display() {
        pos = head;    //head는 첫번째 노드
        while (pos->next != NULL) {
            cout << pos->val << " ";
            pos = pos->next;
        }
        cout << pos->val << endl;
    }
 
    int last() {
        int cnt = 1;
        if (head == NULLreturn 0;
        pos = head;
        while (pos->next != NULL) {
            cnt++;
            pos = pos->next;
        }
        return cnt;
    }
 
    void insert(int cur, int n) {//몇번째 위치에 값을 삽입
        int cnt = 0;
        int L = last();
        if (L < 2return;
        if (cur < 1return;
        if (L - 1 < cur) return;         //삽입 안되는 경우
        pos = head;
        for (cnt = 0; cnt < cur; cnt++) {
            if (cnt == (cur - 1)) {      //삽입할 위치라면
                New = new node;          //노드생성
                New->val = n;
                New->next = pos->next;
                pos->next = New;
                return;                   
            }
            pos = pos->next;
        }
    }
    
    void insert2(int bal,int n) {  //해당 값을 찾으면 그 노드오른쪽에 삽입
        pos = head;
        //cout << pos << "  " << pos->val << "  " << pos->next << endl;
        while (pos->next != NULL) {
            //pos = pos->next;
            if (pos->val == bal) {
                New = new node;
                New->next = pos->next;
                New->val = n;
                pos->next = New;
                return;
            }
            pos = pos->next;
        }
    }
 
    void Delete(int n) { // 값을 기준으로 값 찾으면 삭제
        node *data = head;
        node *data_nx = head->next; // 두번째 노드!!  head->next가 가리키는것은 2번째 노드임
        node *remove = NULL;
 
        if (data->val == n) { // 첫번째 값을 지우는 경우
            delete[] data; // 메모리해제
            head = data_nx; // head포인터가 다음노드를 가지도록 함
            return;
        }
 
        while (data->next != NULL) { // 첫 노드가 가리키는 것이 NULL이 아니라면  
            data = data_nx;         // data는 첫 노드가 아닌 두번째 노드
            data_nx = data->next;   // data_nx(두번째 노드) 는 다음 노드
            if (data->val == n) {    //값을 찾음
                remove->next = data_nx; // remove가 가리키는 것은 data_nx노드
                delete[] data;
                return;
            }
            remove = data;        // remove포인터는 data포인터와 같은 값 가리킴
        }
    }
    
    ~list() {
        node *data = head;
        node *data_nx = head->next;
 
        delete[] data;
        while (data_nx != NULL) {
            data = data_nx;
            data_nx = data->next;
            delete[] data;
        }
    }
 
};
 
int main()
{
    list p;
    for (int i = 1; i <= 5; i++) p.create(101 * i);
 
    p.display();
    cout << p.last() << endl;
    p.insert(31000);
    p.insert(55000);
    p.insert2(303,98765);
    p.display();
    p.Delete(404);
    p.display();
    return 0;
}
cs