0%

ADT를 활용한 Linked List 구현


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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#pragma once

typedef struct Node
{
int data;
struct Node* Next;
}Node;

typedef struct LinkedList
{
struct Node* head; // HEAD를 가르키는 Node 포인터 변수
struct Node* before; // 이전노드를 가르키는 Node 포인터 변수
struct Node* cur; // 현재 노드를 가르키는 Node 포인터 변수
};

void LInitialize(LinkedList* plist)
{
plist->head = (Node*)malloc(sizeof(Node)); // 동적 할당.
plist->head->Next = NULL; // 더미노드를 가리키도록 함.
}

void LInsert(LinkedList *plist, int data)
{
Node* nNode = (Node*)malloc(sizeof(Node)); // 신규 노드 생성
nNode->data = data;
nNode->Next = plist->head->Next;
plist->head->Next = nNode;
}

void LFirst(LinkedList* plist)
{
if (plist->head->Next != NULL)
{
plist->before = plist->head;
plist->cur = plist->head->Next; // 가장 첫번째로 생성된 노드를 가르킴
printf("%d", plist->cur->data);
}
}

void LNext(LinkedList* plist)
{
if (plist->cur->Next != NULL)
{
plist->before = plist->cur;
plist->cur = plist->cur->Next;
printf("%d", plist->cur->data);
}
}

void LDelete(LinkedList* plist)
{
printf("\n 데이터 삭제 %d ", plist->cur->data);// 삭제되는 노드의 데이터를 출력
plist->cur = plist->cur->Next;// 삭제하기 전에 Current를 다음 노드로 변경
free(plist->before->Next); // 노드 삭제
plist->before->Next = plist->cur; // 이전 노드가 연결이 끊어졌으므로, Current 노드(삭제한노드의 그 다음노드)와 연결
}



int main()
{
LinkedList list;
LInitialize(&list);
LInsert(&list, 11); // 노드 생성
LInsert(&list, 22); // 노드 생성
LInsert(&list, 33); // 노드 생성
LInsert(&list, 44); // 노드 생성
LInsert(&list, 55); // 노드 생성
LFirst(&list);
LNext(&list);
LDelete(&list);
LNext(&list);

}