DLL 기본 개념

우리누리·2022년 8월 8일
0

DLL은 Double Linked List의 약자이며
데이터들을 저장하기위해 사용되는 데이터 구조이다.
SLL과 다르게 데이터들이 두 방향으로 연결 되어있는 것을 말한다.

이는 Node를 이용하여 데이터와
다음 방향의 노드를 가리킬 Next 포인터,
그리고 이전 방향의 노드를 가리킬 Prev 포인터를 이용한다.

코드

#define MAX_NODE 10000

struct Node {
	int data;
	Node* prev;
	Node* next;
};

Node node[MAX_NODE];
int nodeCnt;
Node* head;

Node* getNode(int data) {
	node[nodeCnt].data = data;
	node[nodeCnt].prev = nullptr;
	node[nodeCnt].next = nullptr;
	return &node[nodeCnt++];
}

void init()
{
	if (head != 0)
	{
		head->next = 0;
		head->prev = 0;
	}
}

void addNode2Head(int data)
{
	Node* node = getNode(data);
	if (head == 0)
	{
		head = node;
		return;
	}
	node->next = head;
	head->prev = node;
	head = node;
}

void addNode2Tail(int data)
{
	Node* temp = head;
	Node* node = getNode(data);
	while (temp->next != 0)
	{
		temp = temp->next;
	}
	node->prev = temp;
	temp->next = node;
	
}

void addNode2Num(int data, int num)
{
	Node* temp_prev = head;
	Node* node = getNode(data);
	if (num == 1)
	{
		node->next = head;
		head->prev = node;
		head = node;
		return;
	}
	else
	{
		for (int i = 0; i < num - 1; i++)
		{
			if (i > 0)
			{
				temp_prev = temp_prev->next;
			}
		}
		if (temp_prev->next != 0)
		{
			node->next = temp_prev->next;
			temp_prev->next->prev = node;
		}
		node->prev = temp_prev;
		temp_prev->next = node;

	}

}

int findNode(int data)
{
	Node* temp = head;
	int cnt = 1;
	while (1)
	{
		if (temp->data == data)
		{
			break;
		}
		temp = temp->next;
		cnt++;
	}
	return cnt;
}

void removeNode(int data)
{
	Node* temp = head;
	if (head->data == data)
	{
		head = head->next;
		head->prev = 0;
		return;
	}
	while (temp->next != 0 && temp->next->data != data)
	{
		temp = temp->next;
	}
	if (temp->next != 0)
	{

		temp->next = temp->next->next;

		if (temp->next!= 0)
		{
			temp->next->prev = temp;
		}
	}
}

int getList(int output[MAX_NODE])
{
	int cnt = 0;
		Node* temp = head;
		if (head != 0)
		{
			while (1)
			{
				output[cnt] = temp->data;
				if (temp->next == 0)
				{
					break;
				}
				temp = temp->next;
				cnt++;
			}
		}
		return cnt + 1;
}

int getReversedList(int output[MAX_NODE])
{
	int cnt = 0;
	Node* temp = head;
	while (temp->next != 0)
	{
		temp = temp->next;
	}
	if (temp != 0)
	{
		while (1)
		{
			output[cnt] = temp->data;
			if (temp == head)
			{
				break;
			}
			temp = temp->prev;
			cnt++;
		}
	}
	return cnt + 1;
}

설명

getNode 함수는 새로운 data값을 갖는 노드를 생성하는 것.

addNode2Head 함수는 Linked List의 맨 앞 부분에 새로운 노드를 추가하는 것

addNode2Tail 함수는 Linked List의 맨 끝 부분에 새로운 노드를 추가하는 것

addNode2Num 함수는 Linked List에서 num에 해당하는 순서에 새로운 노드를 추가하는 것

findNode 함수는 Linked List에서 해당 data 값을 갖는 node의 순서를 반환하는 것

removeNode 함수는 Linked List에서 해당 data 값을 갖는 node를 삭제하는 것

getList 함수는 output에 data 값들을 모두 저장하고 총 노드의 개수를 반환하는 것

getReversedList 함수는 output에 data 값들을 역순으로 모두 저장하고 총 노드의 개수를 반환하는 것

0개의 댓글