본문 바로가기
Programming/Knowledge

LinkedList (연결 리스트)

by OKOK 2018. 5. 7.
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
#include <stdio.h>
#include "DLinkedList.h"
 
int WhoIsPrecede(int d1, int d2) {
    if (d1 < d2)
        return 0;
    else
        return 1;
}
 
int main(void) {
    List list;
    int data;
    ListInit(&list);
    SetSortRule(&list, WhoIsPrecede);
 
    LInsert(&list, 11);
    LInsert(&list, 11);
    LInsert(&list, 22);
    LInsert(&list, 22);
    LInsert(&list, 33);
    printf("current data num : %d \n", LCount(&list));
 
    if (LFirst(&list, &data)) {
        printf("%d ", data);
        while (LNext(&list, &data))
            printf("%d ", data);
    }
    printf("\n\n");
 
    if (LFirst(&list, &data)) {
        if (data == 22)
            LRemove(&list);
 
        while (LNext(&list, &data)) {
            if (data == 22)
                LRemove(&list);
        }
    }
 
    printf("current data num : %d \n", LCount(&list));
 
    if (LFirst(&list, &data)) {
        printf("%d ", data);
        while (LNext(&list, &data)) {
            printf("%d ", data);
        }
    }
    printf("\n\n");
    return 0;
}
cs


이전 배열기반의 리스트는 정적이어서 메모리의 길이를 변경하는 것이 불가능합니다. 그리고 삽입 삭제시 그 이후의 배열 전부를 이동시켜야 하므로 연산이 오래걸립니다. 따라서, 노드를 기반으로한 링크드 리스트를 상황에 따라서 사용합니다. 


WhoIsPrecede 를 통해서 정렬을 위한 기준을 만듭니다. 그리고 SetSortRule의 매개변수로 넣어줍니다. 

헤더파일을 살펴보면 노드 구조체를 선언하여서 데이터 필드와 새로운 노드를 꼬리물어서 만들어 줍니다. 그리고 리스트 구조체에서 헤더 노드, 커런트노드, 이전노드를 만들고, 데이터의 숫자를 기록하는 넘오브데이터 변수. 그리고 정렬을 위한 int(*comp)(int d1, int d2) 함수를 선언합니다.