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

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๊ฐœ๋…

youngdeok 2023. 2. 28. 17:39

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ์ถ”์ƒ ์ž๋ฃŒํ˜•

void ListInit(List *plist)

  • ์ดˆ๊ธฐํ™”ํ•  ๋ฆฌ์ŠคํŠธ์˜ ์ฃผ์†Œ ๊ฐ’์„ ์ธ์ž๋กœ ์ „๋‹ฌ ํ•ด์•ผํ•œ๋‹ค.
  • ๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ํ›„ ์ œ์ผ ๋จผ์ € ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

void LInsert(List *plist, LData data)

  • ๋ฆฌ์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•œ๋‹ค. ๋งค๊ฐœ๋ณ€์ˆ˜ data์— ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

int LFirst(List *plist)

  • ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๊ฐ€ pdata๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.
  • ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™”๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.
  • ์ฐธ์กฐ ์„ฑ๊ณต ์‹œ 1, ์‹คํŒจ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

int LNext(List *plist)

  • ์ฐธ์กฐ๋œ ๋ฐ์ดํ„ฐ์˜ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๊ฐ€ pdata๊ฐ€ ๊ฐ€๋ฅดํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค.
  • ์ˆœ์ฐจ์ ์ธ ์ฐธ์กฐ๋ฅผ ์œ„ํ•ด์„œ ๋ฐ˜๋ณต ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ฐธ์กฐ๋ฅผ ์ƒˆ๋กœ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋จผ์ € LData ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค.
  • ์ฐธ์กฐ ์„ฑ๊ณต์‹œ 1, ์‹คํŒจ์‹œ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

LData LRemove(List *plist)

  • LFirst ๋˜๋Š” LNext ํ•จ์ˆ˜์˜ ๋งˆ์ง€๋ง‰ ๋ฐ˜ํ™˜ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

int LCount(List *plist)

  • ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ธฐ์— ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์œ„ํ•œ ์ ์ ˆํ•œ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค!!!.

typedef struct _node
{
    LData data;
    struct _node *next;
} Node;

์—ฌ๊ธฐ์„œ

struct _node *next; ๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ํ˜„์žฌ ๋…ธ๋“œ์˜ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Ÿ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๋…ธ๋“œ๋ฅผ ๋ฐ”๊ตฌ๋‹ˆ next๋ณ€์ˆ˜๋Š” ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ์žก๊ณ ์žˆ๋Š” ์ค„ ์ •๋„๋กœ ์ดํ•ดํ•˜๋ฉด ํŽธํ•œ๋‹ค.

 

typedef struct __ArrayList
{
    Node *head;
    Node *cur;
    Node *before;
    int numOfData;
} LinkedList;

head๋Š” ๊ฐ€์žฅ ์•ž์˜ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚จ๋‹ค.

void ListInit(List *plist)
{
    plist->head = (Node *)malloc(sizeof(Node));
    plist->head->next = NULL;
    plist->numOfData = 0;
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด head์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•œ๋‹ค. ์™œ ๋”๋ฏธ ๋…ธ๋“œ๋ฅผ ๋งŒ๋“œ๋ƒ ํ•˜๋ฉด ๋”๋ฏธ๋…ธ๋“œ๊ฐ€ ์—†์ด ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ๊ฒฝ์šฐ, ์ฒซ๋ฒˆ์งธ ๋…ธ๋“œ์™€ ๋‘๋ฒˆ์งธ ๋…ธ๋“œ์˜ ์‚ญ์ œ ์‹œ์— ์ฐจ์ด๊ฐ€ ์ƒ๊ฒจ ์ฝ”๋“œ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ์ƒํ™ฉ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•˜๊ธฐ ์œ„ํ•ด head๊ฐ€ ๋”๋ฏธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ๊ตฌ์„ฑ ํ•œ๋‹ค.

int LFirst(List *plist, LData *pdata)
{
    if (plist->head->next == NULL)
        return FALSE;
    plist->before = plist->head;
    plist->cur = plist->head->next;

    *pdata = plist->cur->data;
    return TRUE;
}

int LNext(List *plist, LData *pdata)
{
    if (plist->cur->next == NULL)
        return FALSE;
    plist->before = plist->cur;
    plist->cur = plist->cur->next;
    *pdata = plist->cur->data;
    return TRUE;
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด

before๊ฐ€ cur์˜ ํ•ญ์ƒ ๋’ค์— ๋†“์ด๋Š” ๊ฑธ ๋ณผ์ˆ˜ ์žˆ๋Š”๋ฐ, ์‚ญ์ œ์‹œ ์ด์ „ before๋…ธ๋“œ๋กœ cur์ด ์ด๋™ ํ•  ์ˆ˜

์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ํ•œ๋‹ค.

 

LData LRemove(List *plist)
{
    int Ddata = plist->cur->data;
    Node *DNode = plist->cur;

    plist->before->next = plist->cur->next;
    plist->cur = plist->before;
    
    free(DNode);
    (plist->numOfData)--;
    return Ddata;
}

์‚ญ์ œ์— ๋Œ€ํ•œ ์ฝ”๋“œ์ด๋‹ค. ์‚ญ์ œ์‹œ cur์ด ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ before ์ฆ‰ ์ด์ „ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋Š” ์ด์œ ๋Š” ์•„์ง ์ฐธ์กฐ๋˜์ง€ ์•Š์€ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์‚ญ์ œ ์ „(LRemove ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „)

์‚ญ์ œ ํ›„(LRemove ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„)

๋…ธ๋“œ ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ: https://boiling-fowl-6d6.notion.site/LinkedList-fb60710c9c914575b74d06bd619dd4bf

๋ฐฐ์—ด ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ: https://boiling-fowl-6d6.notion.site/ArrayList-25e61bb8962c4f53ad4e228489f9912c

'์ž๋ฃŒ ๊ตฌ์กฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

ํž™ ๊ฐœ๋…  (0) 2023.02.28
ํŠธ๋ฆฌ ๊ฐœ๋… ๋ฐ ๊ตฌํ˜„  (0) 2023.02.28
ํ ๊ฐœ๋…  (0) 2023.02.28
์Šคํƒ ๊ฐœ๋…  (0) 2023.02.28
์ž๋ฃŒ ๊ตฌ์กฐ ์ด ์ •๋ฆฌ  (0) 2023.02.28