앞서 봤던 DLL을 구현하여 코드상에서 확인해보겠다.
<공부한것을 기록하기에 틀린게 있을 수 있습니다 . 틀린 점 말씀해주시면 감사하겠습니다>
01 . 헤더 파일
//DLL.h
#ifndef DLL_H
#define DLL_H
#include<stdio.h>
#include<stdlib.h>
typedef int ElementType;
typedef struct TagNode
{
ElementType Data;
TagNode* PrevNode;
TagNode* NextNode;
}Node;
#include"DLL.h"
//생성
Node* DLL_CreateNode(ElementType Data);
//소멸
void DLL_DestroyNode(Node* Node);
//추가
void DLL_AppendNode(Node** Head, Node* NewNode);
//삽입
void DLL_InsertNode(Node* Current, Node* NewNode);
//제거
void DLL_DeleteNode(Node**Head,Node* Delete);
//탐색
Node* DLL_SearchNodeAt(Node* Head, int index);
//수세기
int DLL_GetNodeCount(Node* Head);
//출력
void DLL_PrintNode(Node* Head);
//역순출력
void DLL_ReversePrintNode(Node* Head);
#endif
02 . 함수
//DLL_Func
#include"DLL.h"
//생성
Node* DLL_CreateNode(ElementType Data)
{
Node* NewNode = (Node*)malloc(sizeof(Node));
NewNode->Data = Data;
NewNode->PrevNode = NULL;
NewNode->NextNode = NULL;
return NewNode;
}
//소멸
void DLL_DestroyNode(Node* Node)
{
free(Node);
}
//추가
void DLL_AppendNode(Node** Head, Node* NewNode)
{
if ((*Head) == NULL)//내가 처음으로 추가되는 노드라면
{
(*Head) = NewNode;
}
else
{
Node* Tail = (*Head);
while (Tail->NextNode != NULL)//Tail을 찾을때까지
{
Tail=Tail->NextNode;
}
Tail->NextNode = NewNode;
NewNode->PrevNode = Tail;
}
}
//삽입
void DLL_InsertNode(Node* Current, Node* NewNode)
{
if (Current->NextNode != NULL)//삽입 노드가 Tail이 아니라면
{
NewNode->NextNode = Current->NextNode;
NewNode->NextNode->PrevNode = NewNode;
}
Current->NextNode = NewNode;
NewNode->PrevNode = Current;
}
//제거
void DLL_DeleteNode(Node**Head , Node* Delete)
{
if ((*Head) == Delete)
{
(*Head) = Delete->NextNode;
if (*Head != NULL)//삭제한 노드가 유일한 노드가 아닐때
{
(*Head)->PrevNode = NULL;
}
Delete->NextNode = NULL;
Delete->PrevNode = NULL;
}
else
{
Node* Temp = Delete;
if (Delete->PrevNode != NULL)
Delete->PrevNode->NextNode = Temp->NextNode;
if (Delete->NextNode != NULL)
Delete->NextNode->PrevNode = Temp->PrevNode;
Delete->NextNode = NULL;
Delete->PrevNode = NULL;
}
}
//탐색
Node* DLL_SearchNodeAt(Node* Head, int index)
{
Node* Current = Head;
while (--index > 0)
{
Current = Current->NextNode;
if (Current == NULL)
{
printf("%s\n", "범위를 벗어난 검색입니다");
return NULL;
}
}
return Current;
}
//수세기
int DLL_GetNodeCount(Node* Head)
{
int count = 0;
Node* Tail = Head;
while (Tail != NULL)
{
Tail = Tail->NextNode;
count++;
}
printf("노드의 카운드는 %d", count);
return count;
}
//출력
void DLL_PrintNode(Node* Head)
{
Node* Tail = Head;
while (Tail != NULL)//Tail을 찾을때까지
{
printf("데이터는 %d\n ", Tail->Data);
Tail = Tail->NextNode;
}
printf("출력끝");
}
//역순출력
void DLL_ReversePrintNode(Node* Head)
{
Node* Tail = Head;
while (Tail->NextNode != NULL)//Tail을 찾을때까지
{
Tail = Tail->NextNode;
}
printf("꼬리 찾음\n");
while (Tail != NULL)//Tail을 찾을때까지
{
printf("데이터는 %d\n ", Tail->Data);
Tail = Tail->PrevNode;
}
printf("출력끝");
}
03 . 사용
//Test
#include"DLL.h"
int main(void)
{
Node* List=NULL;
for (int i = 0; i < 5; i++)
{
DLL_AppendNode(&List, DLL_CreateNode(i));
}
DLL_InsertNode(DLL_SearchNodeAt(List, 3), DLL_CreateNode(100));
DLL_PrintNode(List);
DLL_GetNodeCount(List);
DLL_DeleteNode(&List,DLL_SearchNodeAt(List, 0));
DLL_PrintNode(List);
DLL_ReversePrintNode(List);
}
'자료구조' 카테고리의 다른 글
[자료구조] 리스트 - 03 . 환형 링크드 리스트 <구현> (0) | 2023.01.21 |
---|---|
[자료구조] 리스트 - 03 . 환형 링크드 리스트 (0) | 2023.01.20 |
[자료구조] 리스트 - 02 . 더블 링크드 리스트 (0) | 2023.01.16 |
[자료구조] 리스트 - 01. 링크드 리스트 < 예제 > (0) | 2023.01.15 |
[자료구조] 리스트 - 01 . 링크드 리스트 (0) | 2023.01.12 |