1
/**//*
 2
    이중 연결 리스트(Doubly Linked List) : 
 3
    선형 리스트는 역방향 조회를 할 수 없는 단점이 있다. 
 4
    이를 개선한 데이터 구조가 이중 연결 리스트이다.
 5
*/
 6
#include <stdio.h>
 7
#include <malloc.h>
 8
#include <string.h>
 9
10
// 이중 연결 링크드 리스트용 구조체
11
struct Node
12
...{
13
    struct Node *PrevNode;        //역방향 포인터
14
    char Name[20];            //이름
15
    char Phone[20];            //전화번호
16
    struct Node *NextNode;    //정방향 포인터
17
};
18
19
struct Node *GetNode(void);
20
21
// 메인 함수
22
void main(void)
23
...{
24
    int i = 0;
25
    struct Node *head, *tail, *current;
26
27
    //역방향 리스트 생성
28
    tail = NULL;    
29
    
30
    current = GetNode();
31
    strcpy(current->Name, "aa");
32
    strcpy(current->Phone, "11");
33
34
    current->PrevNode = tail;
35
    tail = current;
36
    
37
    current = GetNode();
38
    strcpy(current->Name, "bb");
39
    strcpy(current->Phone, "22");
40
41
    current->PrevNode = tail;
42
    tail = current;
43
    
44
    current = GetNode();
45
    strcpy(current->Name, "cc");
46
    strcpy(current->Phone, "33");
47
48
    current->PrevNode = tail;
49
    tail = current;
50
    
51
    // 정방향 리스트 생성
52
    current = tail;
53
    head = NULL;
54
55
    current->NextNode = head;
56
    head = current;
57
    current = current->PrevNode;
58
59
    current->NextNode = head;
60
    head = current;
61
    current = current->PrevNode;
62
63
    current->NextNode = head;
64
    head = current;
65
    current = current->PrevNode;
66
67
    // 정방향 리스트 출력
68
    current = head;
69
70
    printf("%s %s\n", current->Name, current->Phone);
71
    current = current->NextNode;
72
73
    printf("%s %s\n", current->Name, current->Phone);
74
    current = current->NextNode;
75
76
    printf("%s %s\n", current->Name, current->Phone);
77
    current = current->NextNode;
78
79
    // 역방향 리스트 출력
80
    current = tail;
81
82
    printf("%s %s\n", current->Name, current->Phone);
83
    current = current->PrevNode;
84
85
    printf("%s %s\n", current->Name, current->Phone);
86
    current = current->PrevNode;
87
88
    printf("%s %s\n", current->Name, current->Phone);
89
    current = current->PrevNode;
90
}
91
92
// 구조체 크기만큼 메모리 할당
93
struct Node *GetNode(void)
94
...{
95
    return (struct Node *)malloc(sizeof(struct Node));
96
}