์๋ฃ๊ตฌ์กฐ
์ฐ๊ฒฐ ๋ฆฌ์คํธ 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);
}