JUNGLE 240410 (W03)

KRAFTON JUNGLE Week 03

1. Keywords

Linked List

Node 구조체 정의 및 초기화
// 링크드 리스트의 노드 구조체 정의
typedef struct listNode
{
    struct listNode *next;      // 다음 노드를 가리키는 포인터
    int data;                   // 노드가 저장하는 데이터
}listNode;

// 링크드 리스트 초기화 함수
listNode *init_list(void)
{
    listNode *head;
    head = (listNode *)malloc(sizeof(listNode));
    head->next = NULL;          // 헤드 노드의 다음 노드는 없음
    
    return (head);
}
마지막 Node 찾기 & 전체 Node 개수 세기
// 링크드 리스트의 마지막 노드를 찾는 함수
listNode *find_end(listNode *h)
{
    listNode *cur;
    cur = h;
    
    // 리스트의 끝까지 순회
    while (cur->next != NULL)
    {
        cur = cur -> next;
    }
    return (cur);
}

// 링크드 리스트의 노드 개수를 세는 함수
int node_len(listNode *h)
{
    int cnt;
    listNode *cur;
    cur = h;
    
    cnt = 0;
    // 리스트의 끝까지 순회하면서 개수를 센다.
    while (cur->next != NULL)
    {
        cnt++;
        cur = cur->next;
    }
    return (cnt);
}
Node 검색
// 인덱스로 노드를 찾는 함수
listNode *read_node_idx(listNode *h, int num)
{
    int i;
    listNode *cur;
    cur = h;
    
    i = 0;
    
    // 잘못된 인덱스 예외 처리
    if (num < 1 || num > node_len(h))
    {
        printf("wrong data\n");
        return (h);
    }
    // 해당 인덱스의 노드까지 이동
    while (i < num)
    {
        cur = cur -> next;
        i++;
    }
    return (cur);
}

// 데이터로 노드를 찾는 함수
listNode *read_node_data(listNode *h, int data)
{
    listNode *cur;
    cur = h;
    
    // 리스트를 순회하면서 데이터를 비교
    while (cur -> data != data && cur -> next != NULL)
    {
        cur = cur -> next;
    }
    // 데이터를 찾지 못한 경우 예외 처리
    if (cur -> next == NULL)
    {
        printf("wrong data\n");
        return (h);
    }
    return (cur);
}
Node 삽입
// 맨 앞에 노드를 삽입하는 함수
void add_first_node(listNode *h, int data)
{
    listNode *newNode;
    newNode = (listNode *) malloc(sizeof(listNode));
    newNode -> data = data;
    newNode -> next = h -> next;
    h -> next = newNode;
}

// 맨 뒤에 노드를 삽입하는 함수
void add_last_node(listNode *h, int data)
{
    listNode *end;
    end = find_end(h);
    listNode *newNode;
    newNode = (listNode *) malloc(sizeof(listNode));
    newNode -> data = data;
    end -> next = newNode;
    newNode -> next = NULL;
}

// 중간에 노드를 삽입하는 함수
void insert_node(listNode *h, int n, int data)
{
    if (n == 1)
        add_first_node(h, data);
    else if (n == node_len(h))
        add_last_node(h, data);
    else if (n < 1 && n > node_len(h))
    {
        printf("wrong range\n");
        return ;
    }
    else
    {
        int i;
        listNode *prev;
        prev = h;
        i = 0;
        while (i < n - 1)
        {
            prev = prev -> next;
            i++;
        }
        listNode *newNode;
        newNode = (listNode *) malloc(sizeof(listNode));
        newNode -> data = data;
        newNode -> next = prev -> next;
        prev -> next = newNode;
    }
}
Node 수정
// 노드의 데이터를 수정하는 함수
void edit_node(listNode *h, int search, int modify)
{
    listNode *s;
    s = read_node_idx(h, search);
    if(s == h)
    {
        return ;
    }
    s -> data = modify;
}
Node 삭제
// 첫번째 노드를 삭제하는 함수
void delete_first_node(listNode *h)
{
    listNode *cur;
    cur = h -> next;
    h -> next = cur -> next;
    cur -> next = NULL;
    
    free(cur);
}

// 노드를 삭제하는 함수
void delete_node(listNode *h, int n)
{
    if (n == 1)
        delete_first_node(h);
    else if (n < 1 && n > node_len(h))
    {
        printf("wrong range\n");
        return;
    }
    else
    {
        int i;
        listNode *prev;
        prev = h;
        i = 0;
        while (i < n - 1)
        {
            prev = prev -> next;
            i++;
        }
        listNode *cur;
        cur = prev -> next;
        prev -> next = cur -> next;
        cur -> next = NULL;
        
        free(cur);
    }
}

// 모든 노드를 삭제하는 함수
void delete_all_node(listNode *h)
{
    listNode *cur;
    cur = h;
    
    listNode *nxt;
    while(cur != NULL)
    {
        nxt = cur -> next;
        
        free(cur);
        cur = nxt;
    }
    // free(h);
}
  • free(h): NULL 데이터를 해제하려고 해서 오류 남 -> 주석 처리
Node 출력
// 전체 노드를 출력하는 함수
void print_all_node(listNode *h)
{
    listNode *cur;
    cur = h -> next;
    
    if (cur != NULL)
    {
        while (1)
        {
            printf("%d", cur -> data);
            if (cur -> next == NULL)
            {
                printf("\n");
                break;
            }
            else
                printf("->");
            cur = cur -> next;
        }
    }
    else
    {
        printf("No data\n");
    }
}

포인터 (Pointer)

  • 변수의 메모리 주소를 저장하는 변수
  • 다른 변수의 위치를 가리키고 해당 위치의 값을 읽거나 변경 가능
  • 포인터는 메모리의 어떤 위치든지 가리킬 수 있음
  • 포인터 변수는 선언 시에 데이터 타입을 지정하여 해당 타입의 변수를 가리키게 됨
* 연산자
  • 포인터가 가리키는 메모리 위치의 값에 접근하는데 사용
  • ex. *ptr은 포인터 ptr이 가리키는 위치의 값
& 연산자
  • 변수의 주소를 구하는 데 사용
  • ex. &var은 변수 var의 주소를 나타냄