์ž๋ฃŒ๊ตฌ์กฐ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ Linked list

์•„์˜ณ์ด 2021. 7. 17. 20:17
๊ตฌ๋ถ„ ๊ตฌํ˜„ ๋ฐฉ์‹ ์ˆœ์ฐจ์  ์ €์žฅ์„ ๊ตฌํ˜„ํ•œ ๋ฐฉ๋ฒ• ์ž๋ฃŒ ์ ‘๊ทผ ์†๋„ ๊ตฌํ˜„ ๋ณต์žก๋„  
๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ ๋ฐฐ์—ด ๋ฌผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์ˆœ์ฐจ์  ๋น ๋ฆ„ O(1) ๋‚ฎ์Œ ์ตœ๋Œ€ ์ €์žฅ ๊ฐœ์ˆ˜ ํ•„์š”
์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ํฌ์ธํ„ฐ ๋…ผ๋ฆฌ์  ์ €์žฅ ์ˆœ์„œ๊ฐ€ ์ˆœ์ฐจ์  ๋А๋ฆผ O(n) ๋†’์€  

๋ฐฐ์—ด๋ฆฌ์ŠคํŠธ๋Š” ํŠน์ • ์ธ๋ฑ์Šค์— ๋ฐ”๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฃŒ์ ‘๊ทผ ์†๋„๊ฐ€ O(1)์ด๊ณ 

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋Š” ํ—ค๋”๋…ธ๋“œ๋ถ€ํ„ฐ ํฌ์ธํ„ฐ๋กœ ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— n๋ฒˆ์งธ ์ž๋ฃŒ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด O(n)

-- ๋‹ค๋งŒ ๋ฐฐ์—ด๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€, ์‚ญ์ œ ํ•˜๋ ค๋ฉด ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋ ค๋Š” ๋…ธ๋“œ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ด๋™์‹œ์ผœ์•ผํ•ด์„œ

์ž๋ฃŒ์˜ ์ถ”๊ฐ€ ์‚ญ์ œ๊ฐ€ ๋งŽ์œผ๋ฉด ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœ 

 

-์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ ๊ตฌ์กฐ : ์ž๋ฃŒ + ์—ฐ๊ฒฐ ์ •๋ณด(๋งํฌ)

-์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ์˜ ๋งํฌ = NULL

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

typedef struct LinkedListNodeType {
	int data;								// ๋ฐ์ดํ„ฐ
	struct LinkedListNodeType *pLink;		// ์—ฐ๊ฒฐ ์ •๋ณด(๋งํฌ)
} LinkedListNode;

typedef struct LinkedListType {
	int             currentCount;
    LinkedListNode  headerNode;		// ๊ฐ€๋ฅด๊ธธ ๋…ธ๋“œ ์ €์žฅ์„ ์œ„ํ•œ ํ—ค๋”๋…ธ๋“œ
} LinkedList;

LinkedList *createLinkedList(void)
{
	LinkedList *pReturn = (LinkedList *)malloc(sizeof(LinkedList));
	if (pReturn == NULL)
		return (NULL);

	memset(pReturn, 0, sizeof(LinkedList));
	return pReturn;
}

int getLinkedListData(LinkedList* pList, int position)
{
	if (pList == NULL)
		return (1);
	if (position < 0 || position >= pList->currentCount)
		return (1);

	int i = 0;

	LinkedListNode *pCurrentNode = &(pList->headerNode);
	for (i = 0; i <= position; i++)		// ํ—ค๋”๋…ธ๋“œ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— position + 1๋ฒˆ
		pCurrentNode = pCurrentNode->pLink;

	return (pCurrentNode->data);
}

int addLinkedListData(LinkedList* pList, int position, int data)
{
	if (pList == NULL )
		return (1);
	if (position < 0 || position > pList->currentCount)
		return (1);

	int i = 0;
	LinkedListNode *pNewNode = NULL;
	LinkedListNode *pPreNode = NULL;

	pNewNode = (LinkedListNode*)malloc(sizeof(LinkedListNode));
	pNewNode->data = data;

	pPreNode = &(pList->headerNode);
	for (i = 0; i < position; i++)		// ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์œ„์น˜์˜ ์ด์ „ ๋…ธ๋“œ๊นŒ์ง€
		pPreNode = pPreNode->pLink;

	pNewNode->pLink = pPreNode->pLink;
	pPreNode->pLink = pNewNode;
	pList->currentCount++;
	return (0);
}

int removeLinkedListData(LinkedList* pList, int position)
{
	if (pList == NULL)
		return (1);
	if (position < 0 || position >= pList->currentCount)
		return (1);

	int i = 0;
	LinkedListNode *pDelNode = NULL;
	LinkedListNode *pPreNode = NULL;

	pPreNode = &(pList->headerNode);
	for (i = 0; i < position; i++)
		pPreNode = pPreNode->pLink;

	pDelNode = pPreNode->pLink;
	pPreNode->pLink = pDelNode->pLink;
	free(pDelNode);
	pList->currentCount--;
	return (0);
}

int deleteLinkedList(LinkedList* pList)
{
	if (pList == NULL)
		return (1);

	LinkedListNode *pDelNode = NULL;
	LinkedListNode *pPreNode = pList->headerNode.pLink;
	while (pPreNode != NULL)
	{
		pDelNode = pPreNode;
		pPreNode = pPreNode->pLink;

		free(pDelNode);
	}
	free(pList);

	return (0);
}

int getLinkedListLength(LinkedList* pList)
{
	if (pList != NULL)
		return pList->currentCount;

	return (0);
}

int iterateLinkedList(LinkedList* pList)
{
	if (pList == NULL)
		return (1);

	int count = 0;
	LinkedListNode* pNode = NULL;

	pNode = pList->headerNode.pLink;
	while (pNode != NULL)
	{
		printf("[%d],%d\n", count, pNode->data);
		count++;

		pNode = pNode->pLink;
	}
	printf("๋…ธ๋“œ ๊ฐœ์ˆ˜: %d\n", count);
	return (0);
}

void concatLinkedList(LinkedList* pListA, LinkedList* pListB)
{
	LinkedListNode* pNodeA = NULL;

	if (pListA != NULL && pListB != NULL)
	{
		pNodeA = pListA->headerNode.pLink;
		if (pNodeA != NULL)
		{
			while (pNodeA->pLink != NULL)
				pNodeA = pNodeA->pLink;

			pNodeA->pLink = pListB->headerNode.pLink;
		}
		else
			pListA->headerNode.pLink = pListB->headerNode.pLink;

		pListB->headerNode.pLink = NULL;
	}
}

void reverseLinkedList(LinkedList* pList)
{
	LinkedListNode *pNode = NULL, *pCurrentNode = NULL, *pPrevNode = NULL;

	if (pList != NULL) {
		pNode = pList->headerNode.pLink;
		while (pNode != NULL) {
			pPrevNode = pCurrentNode;
			pCurrentNode = pNode;
			pNode = pNode->pLink;
			pCurrentNode->pLink = pPrevNode;
		}

		pList->headerNode.pLink = pCurrentNode;
	}
}

int main(void)
{
	LinkedList *pListA = NULL;
	LinkedList *pListB = NULL;

	pListA = createLinkedList();
	pListB = createLinkedList();
	addLinkedListData(pListA, 0, 10);
	addLinkedListData(pListA, 1, 20);
	addLinkedListData(pListA, 2, 30);
	addLinkedListData(pListB, 0, 40);
	addLinkedListData(pListB, 1, 50);

	printf("์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ฒฐํ•ฉ ์ „\n");
	printf("\n์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ A\n");
	iterateLinkedList(pListA);
	printf("\n์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ B\n");
	iterateLinkedList(pListB);

	concatLinkedList(pListA, pListB);

	printf("\n์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ๊ฒฐํ•ฉ ํ›„\n");
	printf("\n์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ A\n");
	iterateLinkedList(pListA);
	printf("\n์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ B\n");
	iterateLinkedList(pListB);

	reverseLinkedList(pListA);
	printf("\nreverseLinkedList()\n");
	iterateLinkedList(pListA);

	deleteLinkedList(pListA);
	deleteLinkedList(pListB);

	return (0);
}