Home 연결 리스트 2
Post
Cancel

연결 리스트 2

7장 연결 리스트 2

- 정리의 기반은 학교 강의 노트와 [c언어로 쉽게 풀어쓴 자료구조]를 참고하였습니다.

저의 정리가 옳지 않다면 피드백 부탁드립니다.


원형 연결 리스트

  • 원형 연결 리스트란?

    마지막 노드가 첫 번째 노드를 가리키는 리스트 즉, 마지막 노드의 링크 필드가 NULL이 아니라 첫 번째 노드 주소가 되는 리스트

  • 장점 : 원형 연결 리스트에서는 하나의 노드에서 다른 모든 노드로의 접근이 가능하다.

    하나의 노드에서 링크를 계속 따라 가면 결국 모든 노드를 거쳐서 자기 자신으로 되돌아 올 수 있는 것.

    따라서 노드의 삽입과 삭제가 단순 연결 리스트보다는 용이

원형 연결 리스트 구현

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
#include <stdio.h>
#include <stdlib.h>

typedef int element;
typedef struct ListNode {
    element data;
    struct ListNode *link;
} ListNode;

//출력
void print(ListNode* head)
{
    ListNode* p;

    if (head == NULL)
        return;
    
    p = head->link;
    do{
        printf("%d->", p->data);
        p = p->link;
    }while (p != head);

    printf("%d->", p->data);
}

//헤드에 삽입
ListNode* insert_first(ListNode* head, element data)
{
    ListNode *node = (ListNode *)malloc(sizeof(ListNode));
    node->data = data;
    if (head == NULL) {
        head = node;
        node->link = head;
    }
    else {
        node->link = head->link;
        head->link = node;
    }
    return head;
}

ListNode* insert_last(ListNode*head, element data)
{
    ListNode *node = (ListNode *)malloc(sizeof(ListNode));
    node->data = data;
    if (head == NULL){
        head = node;
        node->link = head;
    }
    else{
        node->link = head->link;
        head->link = node;
        head = node;
    }
    return head;
}

이중 연결 리스트

단순 연결 리스트 : 선행 노드 찾기 매우 어렵다 원형 연결 리스트 : 거의 전체 노드를 거쳐서 돌아와야함

이중 연결 리스트로 해결

  • 특정 노드에서 양방향으로 자유롭게 움직일 필요가 있을 때 사용

핵심

1
p = p->llink->rlink = p->rlink->llink

노드의 구성

1
2
3
4
5
6
typedef int element;
typedef struct ListNode{
    element data;
    struct ListNode* llink;
    struct ListNode* rlink;
} ListNode;

이중 연결 리스트 구현

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char element[100];
typedef struct ListNode{
    element data;
    struct ListNode* llink;
    struct ListNode* rlink;
} ListNode;

ListNode* current;

//초기화
void init(ListNode* phead)
{
    phead->llink = phead;
    phead->rlink = phead;
}

//출력
void print(ListNode* phead)
{
    ListNdoe* p;
    for (p = phead->rlink; p != phead; p = p->rlink){
        if (p == current)
            printf("<-| %s |-> ", p->data);
        else
            printf("<-| %s |-> ", p->data);
    }
    printf("\n");
}

//새 노드를 before의 오른쪽에 삽입.
void insert(ListNode *before, element data)
{
    ListNode *newnode = (ListNode *)malloc(sizeof(ListNode));
    strcpy(newnode->data, data);
    newnode->llink = before;
    newnode->rlink = before->rlink;
    before->rlink->llink = newnode;
    before->rlink = newnode;
}

//삭제
void delete(ListNode* head, ListNode* removed)
{
    if (removed == head)
        return;
    
    removed->llink->rlink = removed->rlink;
    removed->rlink->llink = removed->llink;
    free(removed);
}
This post is licensed under CC BY 4.0 by the author.