SteffenLee

[C/C++]동적할당 연결리스트 본문

Progamming/C,C++

[C/C++]동적할당 연결리스트

SteffenLee 2018. 4. 5. 23:33

동적할당 연결리스트를 만들어봤습니다.



1
2
3
4
typedef struct Node {
    int data;
    struct Node * next_node;
}Node;
cs

Node 구조체입니다.


node는 데이터와 다음 노드의 주소를 갖고 있습니다.


이런 식으로 이어지면 연결리스트가 됩니다.

1
2
3
4
5
6
typedef struct _List {
    Node * head;
    Node * tail;
    Node * current;
    int NumOfData;
}List;

cs

연결리스트를 관리하기 위한 구조체입니다.

head는 머리, tail은 꼬리, current는 현재 노드를 가르킵니다.



노드 초기화

1
2
3
4
5
6
7
void reset_node(List *list) {
    list->head = NULL;
    list->current = NULL;
    list->tail = NULL;
    list->NumOfData = 0;
}
 
cs

각각의 노드는 데이터가 없으므로 NULL로 초기화 합니다.



노드 출력

1
2
3
4
5
6
7
8
void Print_Node(List *list) {
    list->current = list->head;
 
    while (list->current != NULL) {
        cout << "노드 출력 : " << list->current->data << endl;
        list->current = list->current->next_node;
    }
}
cs

노드를 출력하는데 NULL을 만나면 출력이 종료가 됩니다.




노드 추가

머리 노드 추가는 이런 식으로 진행이 됩니다.

꼬리 노드 추가도 같은 방식으로 진행이 됩니다.


1. 머리노드 추가

1
2
3
4
5
6
7
8
9
10
11
12
void Add_Data_head(List *list, int data) {
    Node *NewNode = (Node *)malloc(sizeof(Node));
    NewNode->data = data;
    NewNode->next_node = NULL;
 
    if (list->head == NULL)
        list->tail = NewNode;
    else
        NewNode->next_node = list->head;
    list->head = NewNode;
    (list->NumOfData)++;
}
cs


2. 꼬리노드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
void Add_Data_tail(List *list, int data) {
    Node *NewNode = (Node*)malloc(sizeof(Node));
    NewNode->data = data;
    NewNode->next_node = NULL;
 
    if (list->tail == NULL)
        list->tail = NewNode;
    else
        list->tail->next_node = NewNode;
    list->tail = NewNode;
    (list->NumOfData)++;
}
 
cs

3. 원하는 위치에 노드 추가

원하는 위치의 노드 추가는 이러한 방식으로 진행이 됩니다.


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
void Add_Data_any(List*list, int location, int _data) {
    
    Node* NewNode = (Node*)malloc(sizeof(Node));
 
    NewNode->data = _data;
    NewNode->next_node = NULL;
 
    if (location == 1) {
        Add_Data_head(list, _data);
        (list->NumOfData)++;
    }
    else if (location > list->NumOfData) {
        Add_Data_tail(list, _data);
        (list->NumOfData)++;
    }
    else {
        list->current = list->head;
        while (location > 2) {
            list->current = list->current->next_node;
            location--;
        }
        NewNode->next_node = list->current->next_node;
        list->current->next_node = NewNode;
        (list->NumOfData)++;
    }
}
cs




노드 삭제


1. 머리 노드 삭제

이런 식으로 진행이 됩니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
void Del_Data_head(List *list) {
    if (list->NumOfData == 0)
        cout << "Node is None" << endl;
    Node *Muck = (Node *)malloc(sizeof(Node));
    Node *NextData = (Node *)malloc(sizeof(Node));
 
    Muck = list->head;
    NextData = list->head->next_node;
 
    free(Muck);
    list->head = NextData;
    (list->NumOfData)--;
}
cs

2. 꼬리 노드 삭제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Del_Data_tail(List*list) {
    if (list->NumOfData == 0)
        cout << "Node is None" << endl;
    int data = list->NumOfData;
    list->current = list->head;
 
    while (data > 2) {
        list->current = list->current->next_node;
        --data;
    }
 
    Node *Muck = (Node *)malloc(sizeof(Node));
    Node *NextData = (Node *)malloc(sizeof(Node));
 
    Muck = list->current;
    NextData = list->current->next_node;
 
    free(NextData);
    list->tail = Muck;
    list->tail->next_node = NULL;
    (list->NumOfData)--;
}
cs


3.특정 위치 노드 삭제

특정 위치 노드 삭제는 이런 식으로 진행이 됩니다.


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
void Del_Data_any(List *list, int _data) {
    
    if (_data == 1) {
        Del_Data_head(list);
        (list->NumOfData)--;
    }
    else if (_data == list->NumOfData) {
        Del_Data_tail(list);
        (list->NumOfData)--;
    }
 
    int data = list->NumOfData;
    
    list->current = list->head;
    while (_data > 2) {
        list->current = list->current->next_node;
        --_data;
    }
 
    Node * Muck = (Node*)malloc(sizeof(Node));
    Node * NextData = (Node*)malloc(sizeof(Node));
 
    Muck = list->current;
    NextData = list->current->next_node;
    
    list->current->next_node = NextData->next_node;
    free(Muck);
    (list->NumOfData)--;
}
cs




데이터 교체


데이터 교체는 특정한 위치에 있는 노드의 데이터를 바꾸는 것인데

제가 생각한 것은 그 위치에 노드를 삭제하고 그 부분에 데이터를 추가하면 된다 생각해서 

1
2
3
4
5
6
void Node_Data_Change(List*list, int location, int _data) {
 
    Del_Data_any(list, location);
    Add_Data_any(list, location, _data);
    
}
cs

이런 식으로 만들게 되었습니다. 



Main함수

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
int main() {
    List *= (List *)malloc(sizeof(List));
 
    reset_node(P);
    Add_Data_head(P, 10);
    Add_Data_head(P, 20);
    Add_Data_head(P, 30);
    Add_Data_tail(P, 40);
    Add_Data_tail(P, 50);
    Print_Node(P);
    cout << "//////////////////////////////////" <<endl;
    Add_Data_any(P, 3350);
    Add_Data_any(P, 4150);
    Add_Data_any(P, 2550);
    Print_Node(P);
    cout << "//////////////////////////////////" << endl;
    Del_Data_head(P);
    Del_Data_tail(P);
    Del_Data_any(P, 3);
    Del_Data_any(P, 4);
    Print_Node(P);
    cout << "/////////////////////////////////" << endl;
    Node_Data_Change(P, 25000);
    Print_Node(P);
}
cs


실행 결과



처음으로 구현해본거라 타 블로그를 참고해가면서 만들었습니다.

부족한 부분이 있을 수 있습니다.

지적해주시면 잘 참고하겠습니다.

감사합니다

Comments