1/**//*
2 이중 연결 리스트(Doubly Linked List) :
3 선형 리스트는 역방향 조회를 할 수 없는 단점이 있다.
4 이를 개선한 데이터 구조가 이중 연결 리스트이다.
5*/
6#include <stdio.h>
7#include <malloc.h>
8#include <string.h>
9
10// 이중 연결 링크드 리스트용 구조체
11struct Node
12...{
13 struct Node *PrevNode; //역방향 포인터
14 char Name[20]; //이름
15 char Phone[20]; //전화번호
16 struct Node *NextNode; //정방향 포인터
17};
18
19struct Node *GetNode(void);
20
21// 메인 함수
22void 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// 구조체 크기만큼 메모리 할당
93struct Node *GetNode(void)
94...{
95 return (struct Node *)malloc(sizeof(struct Node));
96}