본문 바로가기

자료구조

[자료구조] 리스트 - 02 . 더블 링크드 리스트 <구현>

앞서 봤던 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);
}