list

// darknet.h

typedef struct list{
    int size;
    node *front;
    node *back;
} list;

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(list)์˜ ๊ตฌ์กฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

  • ๊ตฌ์กฐ์ฒด ์ด๋ฆ„: list

  • ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„:

    • size: ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๋…ธ๋“œ์˜ ์ˆ˜

    • front: ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

    • back: ๋ฆฌ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ

์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ๋ฐ์ดํ„ฐ์˜ ์‚ฝ์ž…, ์‚ญ์ œ, ๊ฒ€์ƒ‰ ๋“ฑ์˜ ์—ฐ์‚ฐ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. Darknet ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ ˆ์ด์–ด๋“ค์„ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ํ•™์Šต ๋ฐ์ดํ„ฐ๋ฅผ ๋ฏธ๋‹ˆ๋ฐฐ์น˜๋กœ ๋ถ„ํ• ํ•œ ํ›„ ๊ฐ๊ฐ์˜ ๋ฏธ๋‹ˆ๋ฐฐ์น˜๋ฅผ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

make_list

list *make_list()
{
	list *l = malloc(sizeof(list));
	l->size = 0;
	l->front = 0;
	l->back = 0;
	return l;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: make_list ์ž…๋ ฅ:

  • ์—†์Œ

๋™์ž‘:

  • ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•จ

์„ค๋ช…:

  • ๋ฆฌ์ŠคํŠธ ๊ตฌ์กฐ์ฒด๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜๊ณ , size, front, back ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ๋นˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

list_pop

void *list_pop(list *l){
    if(!l->back) return 0;
    node *b = l->back;
    void *val = b->val;
    l->back = b->prev;
    if(l->back) l->back->next = 0;
    free(b);
    --l->size;

    return val;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: list_pop

์ž…๋ ฅ:

  • list ๊ตฌ์กฐ์ฒด ํฌ์ธํ„ฐ ๋ณ€์ˆ˜ l

๋™์ž‘:

  • ๋ฆฌ์ŠคํŠธ l์—์„œ ๋’ค์ชฝ์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์„ค๋ช…:

  • ๋ฆฌ์ŠคํŠธ l์˜ back ํฌ์ธํ„ฐ๊ฐ€ NULL์ด๋ฉด, ์ฆ‰ ๋ฆฌ์ŠคํŠธ์— ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

  • ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ๋ฆฌ์ŠคํŠธ์˜ back ํฌ์ธํ„ฐ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋ฅผ ๋ณ€์ˆ˜ b์— ์ €์žฅํ•˜๊ณ , b์˜ val ํ•„๋“œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๋ณ€์ˆ˜ val์— ์ €์žฅํ•œ๋‹ค.

  • ๊ทธ ๋‹ค์Œ, ๋ฆฌ์ŠคํŠธ์˜ back ํฌ์ธํ„ฐ๋ฅผ b์˜ prev ํ•„๋“œ๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ back ํฌ์ธํ„ฐ๊ฐ€ NULL์ด ์•„๋‹ˆ๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ next ํ•„๋“œ๋ฅผ 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.

  • ๊ทธ๋ฆฌ๊ณ  b ๋…ธ๋“œ๋ฅผ ํ•ด์ œํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ์˜ size๋ฅผ 1 ๊ฐ์†Œ์‹œํ‚จ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ val ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

list_insert

void list_insert(list *l, void *val)
{
	node *new = malloc(sizeof(node));
	new->val = val;
	new->next = 0;

	if(!l->back){
		l->front = new;
		new->prev = 0;
	}else{
		l->back->next = new;
		new->prev = l->back;
	}
	l->back = new;
	++l->size;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: list_insert

์ž…๋ ฅ:

  • list *l: ์‚ฝ์ž…ํ•  ๋ฆฌ์ŠคํŠธ์˜ ํฌ์ธํ„ฐ

  • void *val: ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…ํ•  ๊ฐ’์˜ ํฌ์ธํ„ฐ

๋™์ž‘:

  • val ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฆฌ์ŠคํŠธ์˜ ๋’ค์ชฝ์— ์‚ฝ์ž…ํ•œ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ front๋กœ ์ง€์ •ํ•œ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ๋ฆฌ์ŠคํŠธ์˜ back ๋‹ค์Œ์— ์—ฐ๊ฒฐํ•œ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ์˜ size๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

์„ค๋ช…:

  • ์ฃผ์–ด์ง„ ๋ฆฌ์ŠคํŠธ l์˜ ๋งจ ๋’ค์ชฝ์— val ํฌ์ธํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š” ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฝ์ž…ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ front๊ฐ€ ๋˜๋ฉฐ, ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๋…ธ๋“œ๋Š” ๋ฆฌ์ŠคํŠธ์˜ back ๋‹ค์Œ์— ์—ฐ๊ฒฐ๋œ๋‹ค.

  • ์ƒˆ๋กœ์šด ๋…ธ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ๋ฆฌ์ŠคํŠธ์˜ size๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.

free_node

void free_node(node *n)
{
	node *next;
	while(n) {
		next = n->next;
		free(n);
		n = next;
	}
}

ํ•จ์ˆ˜ ์ด๋ฆ„: free_node

์ž…๋ ฅ:

  • n: node ํฌ์ธํ„ฐ

๋™์ž‘:

  • n์„ ์‹œ์ž‘์œผ๋กœ ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

์„ค๋ช…:

  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์˜ ๋…ธ๋“œ๋“ค์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” ์‹œ์ž‘ ๋…ธ๋“œ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์œผ๋ฉฐ, ์ž…๋ ฅ๋œ ๋…ธ๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๋ฅผ ๊ณ„์†ํ•ด์„œ ๋”ฐ๋ผ๊ฐ€๋ฉฐ ๊ฐ ๋…ธ๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.

  • ๋‹ค์Œ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํฌ์ธํ„ฐ๊ฐ€ NULL์ด ๋  ๋•Œ๊นŒ์ง€ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

free_list

void free_list(list *l)
{
	free_node(l->front);
	free(l);
}

ํ•จ์ˆ˜ ์ด๋ฆ„: free_list

์ž…๋ ฅ:

  • l: list ํฌ์ธํ„ฐ

๋™์ž‘:

  • l์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•ด์ œํ•˜๊ณ , ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋„ ํ•ด์ œํ•จ.

์„ค๋ช…:

  • ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ list ๊ตฌ์กฐ์ฒด์™€ ๊ทธ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  node ๊ตฌ์กฐ์ฒด๋ฅผ ํ•ด์ œํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

  • l์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฆฌ์ŠคํŠธ์˜ ๋งจ ์•ž ๋…ธ๋“œ์ธ front๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ๋ชจ๋“  ๋…ธ๋“œ์˜ val ๋ฉค๋ฒ„์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋จผ์ € ํ•ด์ œํ•˜๊ณ , ๊ทธ ๋‹ค์Œ์— ๊ฐ ๋…ธ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•œ๋‹ค.

  • ๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฆฌ์ŠคํŠธ ์ž์ฒด๋ฅผ ํ•ด์ œํ•œ๋‹ค.

free_list_contents

void free_list_contents(list *l)
{
	node *n = l->front;
	while(n){
		free(n->val);
		n = n->next;
	}
}

ํ•จ์ˆ˜ ์ด๋ฆ„: free_list_contents

์ž…๋ ฅ:

  • l: ํ•ด์ œํ•  list์˜ ํฌ์ธํ„ฐ

๋™์ž‘:

  • list์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์˜ val ๋ฉค๋ฒ„๋ฅผ free() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์ œํ•œ๋‹ค.

์„ค๋ช…:

  • list ์ž๋ฃŒ๊ตฌ์กฐ๋Š” node์˜ ํฌ์ธํ„ฐ์™€ size ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ๊ฐ node๋Š” val ๋ฉค๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

  • ์ด ํ•จ์ˆ˜๋Š” list์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ ๊ฐ ๋…ธ๋“œ์˜ val ๋ฉค๋ฒ„๋ฅผ ํ•ด์ œํ•œ๋‹ค.

list_to_array

void **list_to_array(list *l)
{
    void **a = calloc(l->size, sizeof(void*));
    int count = 0;
    node *n = l->front;
    while(n){
        a[count++] = n->val;
        n = n->next;
    }
    return a;
}

ํ•จ์ˆ˜ ์ด๋ฆ„: list_to_array

์ž…๋ ฅ:

  • l: list ํฌ์ธํ„ฐ

๋™์ž‘:

  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ l์˜ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ , ํ•ด๋‹น ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

์„ค๋ช…:

  • ํ•จ์ˆ˜๋Š” ๋™์ ์œผ๋กœ ํ• ๋‹น๋œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น ๋ฐฐ์—ด์„ free ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  • ํ•จ์ˆ˜๋Š” ๋จผ์ € ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ l์˜ ํฌ๊ธฐ์— ํ•ด๋‹นํ•˜๋Š” void ํฌ์ธํ„ฐ ๋ฐฐ์—ด a๋ฅผ ํ• ๋‹นํ•˜๊ณ , ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ๋…ธ๋“œ์˜ ๊ฐ’์„ ๋ฐฐ์—ด a์— ์ €์žฅํ•œ๋‹ค. ์ดํ›„ ๋ฐฐ์—ด a๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Last updated

Was this helpful?