본문 바로가기

프로그래머/C, C++

[면접 대비] C를 사용한 linked list 구현

연결 리스트 전체를 출력하는 코드 예

typedef struct node{
    int value;
    node_t* next;
} node_t;

void print_node(const node*t head)
{
    node_t* p = head;
    while(p != NULL){
        printf("%d", p->value);
        p = p->next;
    }
}

헤드 노드

node_t* head = NULL;

해제코드

void destroy(node_t* head)
{
    node_t* p = head;

    while(p != NULL){
        node_t* next = p->next;
        free(p);
        p = next;
    }
}

node_t* haed = NULL
// 생략
destroy(head);
head = NULL;

삽입코드

맨 앞에 삽입하는 코드

void insert_front(node_t** phead, int n)
{
    node_t* new_node;
    new_node = malloc(sizeof(node_t));
    new_node->value = n;
    new_node->next = *phead;
    *phead = new_node;
}

node_t* head = NULL;

insert_front(&head, 1);

destroy(head);
head = NULL

오름차순으로 삽입하는 코드

void insert_front(node_t** phead, int n)
{
    node_t* new_node;
    new_node = malloc(sizeof(node_t));
    new_node->value = n;

    node_t** pp = phead;
    while(*pp != NULL){
        if((*pp)->value >= n){
            break;    
        }

        *pp = &(*pp)->next;
    }
    new_node->next = *pp;
    *pp = new_node;
}

노드 삭제

void remove(node_t** phead, int n)
{
    node_t** pp = phead;

    while(*pp != NULL){
        if((*pp)->value >= n){        
            node_t* tmp = *pp;
            *pp = (*pp)->next;
            free(tmp);
            break;
        }

        *pp = &(*pp)->next;
    }
}

revert

void revert(node_t** phead)
{
    node_t* next = NULL;
    node_t* cur = *phead;
    node_t* prev = NULL;
    while(cur != NULL){
        next = cur->next;
        cur->next = prev;
        prev = cur;
        cur = next;
    }
    *phead = prev;
}