insque(3) - wariua/manpages-ko GitHub Wiki

NAME

insque, remque - ํ์— ํ•ญ๋ชฉ ์‚ฝ์ž…ํ•˜๊ธฐ/์ œ๊ฑฐํ•˜๊ธฐ

SYNOPSIS

#include <search.h>

void insque(void *elem, void *prev);

void remque(void *elem);

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

insque(), remque():
_XOPEN_SOURCE >= 500
|| /* Glibc 2.19๋ถ€ํ„ฐ: */ _DEFAULT_SOURCE
|| /* Glibc ๋ฒ„์ „ <= 2.19: */ _SVID_SOURCE

DESCRIPTION

insque() ๋ฐ remque() ํ•จ์ˆ˜๋Š” ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค. ๋ฆฌ์ŠคํŠธ์˜ ๊ฐ ํ•ญ๋ชฉ์€ ์ฒ˜์Œ ๋‘ ์š”์†Œ๊ฐ€ ์ˆœ๋ฐฉํ–ฅ ๋ฐ ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ์ธ ๊ตฌ์กฐ์ฒด์ด๋‹ค. ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋Š” ์„ ํ˜•(์ฆ‰ ๋ฆฌ์ŠคํŠธ ๋์—์„œ ์ˆœ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๊ฐ€ NULL์ด๊ณ  ๋ฆฌ์ŠคํŠธ ์ฒ˜์Œ์—์„œ ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๊ฐ€ NULL)์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์›ํ˜•์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

insque() ํ•จ์ˆ˜๋Š” elem์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ์„ prev๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ ๋ฐ”๋กœ ๋‹ค์Œ์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ๊ฐ€ ์„ ํ˜•์ด๋ฉด insque(elem, NULL) ํ˜ธ์ถœ์„ ์จ์„œ ๋ฆฌ์ŠคํŠธ ์ฒซ ํ•ญ๋ชฉ์„ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ ํ˜ธ์ถœ์—์„œ elem์˜ ์ •๋ฐฉํ–ฅ ํฌ์ธํ„ฐ์™€ ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๋ฅผ NULL๋กœ ์„ค์ •ํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ๊ฐ€ ์›ํ˜•์ด๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ์ฒซ ํ•ญ๋ชฉ์˜ ์ˆœ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ์™€ ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๊ฐ€ ๊ทธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ํ•ด์•ผ ํ•˜๋ฉฐ, insque()์˜ prev ์ธ์ž๋„ ๊ทธ ํ•ญ๋ชฉ์„ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•œ๋‹ค.

remque() ํ•จ์ˆ˜๋Š” elem์ด ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ญ๋ชฉ์„ ์ด์ค‘ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
insque(), remque() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

POSIX.1-2001, POSIX.1-2008.

NOTES

์•„์ฃผ ์˜ค๋ž˜๋œ ์‹œ์Šคํ…œ์—์„œ๋Š” ์ด ํ•จ์ˆ˜๋“ค์˜ ์ธ์ž๊ฐ€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ •์˜๋œ struct qelem * ํƒ€์ž…์ด์—ˆ๋‹ค.

struct qelem {
    struct qelem *q_forw;
    struct qelem *q_back;
    char          q_data[1];
};

์•„์ง๋„ <search.h> ํฌํ•จ ์ „์— _GNU_SOURCE๊ฐ€ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด ์ด ํƒ€์ž…์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์ด ํ•จ์ˆ˜๋“ค ์›ํ˜•์˜ ์œ„์น˜๊ฐ€ ์œ ๋‹‰์Šค ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์œ„๋Š” POSIX ๋ฒ„์ „์ด๋‹ค. ์–ด๋–ค ์‹œ์Šคํ…œ์—์„œ๋Š” <string.h>์— ์žˆ๋‹ค.

BUGS

glibc 2.4 ๋ฐ ์ด์ „์—์„œ๋Š” prev์— NULL์„ ์ง€์ •ํ•˜๋Š” ๊ฒŒ ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„ ํ˜• ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ํ˜ธ์ถœ์ž๊ฐ€ ์ˆœ๋ฐฉํ–ฅ ๋ฐ ์—ญ๋ฐฉํ–ฅ ํฌ์ธํ„ฐ๋ฅผ ์ ์ ˆํžˆ ์ดˆ๊ธฐํ™” ํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์ฒ˜์Œ ๋‘ ํ•ญ๋ชฉ์œผ๋กœ ์ตœ์ดˆ ํ˜ธ์ถœ์„ ํ•ด์„œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ–ˆ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ insque() ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ณด์—ฌ ์ค€๋‹ค. ๋‹ค์Œ์€ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์˜ˆ์ด๋‹ค.

$ ./a.out -c a b c
Traversing completed list:
    a
    b
    c
That was a circular list

ํ”„๋กœ๊ทธ๋žจ ์†Œ์Šค

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <search.h>

struct element {
    struct element *forward;
    struct element *backward;
    char *name;
};

static struct element *
new_element(void)
{
    struct element *e;

    e = malloc(sizeof(struct element));
    if (e == NULL) {
        fprintf(stderr, "malloc() failed\n");
        exit(EXIT_FAILURE);
    }

    return e;
}

int
main(int argc, char *argv[])
{
    struct element *first, *elem, *prev;
    int circular, opt, errfnd;

    /* "-c" ๋ช…๋ นํ–‰ ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์›ํ˜•์œผ๋กœ
       ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. */

    errfnd = 0;
    circular = 0;
    while ((opt = getopt(argc, argv, "c")) != -1) {
        switch (opt) {
        case 'c':
            circular = 1;
            break;
        default:
            errfnd = 1;
            break;
        }
    }

    if (errfnd || optind >= argc) {
        fprintf(stderr,  "Usage: %s [-c] string...\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    /* ์ฒซ ๋ฒˆ์งธ ํ•ญ๋ชฉ์„ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ๊ธฐ */

    elem = new_element();
    first = elem;

    elem->name = argv[optind];

    if (circular) {
        elem->forward = elem;
        elem->backward = elem;
        insque(elem, elem);
    } else {
        insque(elem, NULL);
    }

    /* ๋‚˜๋จธ์ง€ ๋ช…๋ นํ–‰ ์ธ์ž๋“ค์„ ๋ฆฌ์ŠคํŠธ ํ•ญ๋ชฉ์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ */

    while (++optind < argc) {
        prev = elem;

        elem = new_element();
        elem->name = argv[optind];
        insque(elem, prev);
    }

    /* ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆœํšŒํ•˜๋ฉด์„œ ํ•ญ๋ชฉ ์ด๋ฆ„ ์ฐ๊ธฐ */

    printf("Traversing completed list:\n");
    elem = first;
    do {
        printf("    %s\n", elem->name);
        elem = elem->forward;
    } while (elem != NULL && elem != first);

    if (elem == first)
        printf("That was a circular list\n");

    exit(EXIT_SUCCESS);
}

SEE ALSO

queue(3)


2019-03-06

โš ๏ธ **GitHub.com Fallback** โš ๏ธ