고급 개발자로 가는 길

Algorithm

Double LinkedList

다크엔지니어 2020. 3. 3. 14:04
반응형

이중 연결 리스트를 C언어로 구현해 보았다.

LinkedList 는 stack, queue 에 비해 유연하다. 유연하다는 것은 중간에 삽입이 간편하다는 것이다.

주로 펌웨어에서 Taks Contorl Block 에서 사용된다. context swiching 이 일어날 때 TCB 는 Task 를 

Double LinkedList 로 관리하고 있다. 

Head 를 통해 List 를 관리하기 때문에 접근성이 좋다.

하지만, 노드가 늘어날 수록 메모리를 추가해 줘야 하기 때문에 Task 의 수가 많아진다면 

당연히 메모리에 부담이 된다. 펌웨어에서 메모리가 늘어나면 매우 치명적이라... 후

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct listNode
{
	struct listNode *llink;
	char data[8];
	struct listNode *rlink;
}linkedNode;

typedef struct
{
	linkedNode *head;
}linkedNode_h;

linkedNode_h *CreateNode()
{
	linkedNode_h *NewNode = (linkedNode_h *)malloc(sizeof(linkedNode_h));
	NewNode->head = NULL;

	return NewNode;
}

void DeleteNode(linkedNode_h *DL, linkedNode *old)
{
	if (DL->head == NULL) return;
	else if (old == NULL) return;
	else
	{
		if (old->rlink == NULL)
		{
			old->llink->rlink = NULL;
		}
		else
		{
			old->rlink->llink = old->llink;
			old->llink->rlink = old->rlink;
			free(old);
		}
	}
}

void InsertNode(linkedNode_h *DL, linkedNode *p, char *strData)
{
	linkedNode *NewNode = (linkedNode *)malloc(sizeof(linkedNode));
	strcpy_s(NewNode->data, strData);

	if (DL->head == NULL)
	{
		DL->head = NewNode;
		NewNode->llink = NULL;
		NewNode->rlink = NULL;
	}
	else
	{
		NewNode->rlink = p->rlink;
		p->rlink = NewNode;
		NewNode->llink = p;
		if (NewNode->rlink != NULL) NewNode->rlink->llink = NewNode;
	}
}

linkedNode *SelectNode(linkedNode_h *DL, char *strData)
{
	linkedNode *Temp;
	Temp = DL->head;

	while (Temp != NULL)
	{
		if (!(strcmp(Temp->data, strData)))
			return Temp;
		else
			Temp = Temp->rlink;
	}
}

void PrintNode(linkedNode_h *DL)
{
	if (DL->head == NULL)
	{
		printf("Node Yet No Existence\n");
		return;
	}

	linkedNode *Temp;
	Temp = DL->head;

	printf("DL : (");
	while (Temp != NULL)
	{
		printf("%s", Temp->data);
		if (Temp->rlink != NULL) printf(", ");
		Temp = Temp->rlink;
	}
	printf(")\n");
}

int main(void)
{
	linkedNode_h *DL = CreateNode();
	linkedNode *p;

	PrintNode(DL);

	printf("이중 연결 리스트 '월' 삽입 -> ");
	InsertNode(DL, NULL, "월"); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '화' 삽입 - >");
	p = SelectNode(DL, "월");
	InsertNode(DL, p, "화"); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '수' 삽입 - >");
	p = SelectNode(DL, "화");
	InsertNode(DL, p, "수"); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '목' 삽입 - >");
	p = SelectNode(DL, "수");
	InsertNode(DL, p, "목"); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '목' 삭제 - >");
	p = SelectNode(DL, "목");
	DeleteNode(DL, p); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '금' 삽입 - >");
	p = SelectNode(DL, "수");
	InsertNode(DL, p, "금"); PrintNode(DL); getchar();

	printf("이중 연결 리스트 '토' 삽입 - >");
	p = SelectNode(DL, "화");
	InsertNode(DL, p, "토"); PrintNode(DL); getchar();

	return 0;
}
반응형

'Algorithm' 카테고리의 다른 글

Merge Sort  (0) 2020.03.04
Quick Sort  (0) 2020.03.03
Bubble Sort  (0) 2020.03.03
Select Sort  (0) 2020.03.03
Stack 자료구조  (0) 2020.02.22