C언어/자료구조

[자료구조 - C언어] Linked List(2) - create, insert

yujin0517 2021. 8. 23. 11:58

사용된 함수

  • create_node : 동적 메모리를 할당받아 메인 함수에서 입력받은 값을 구조체 멤버 변수(value)에 대입함.
  • append_node : tail노드에 새로운 노드를 붙이는 역할을 함.
  • prepend_node : head노드 앞에 새로운 노드를 붙이는 역할을 함.
  • print_node : 생성된 노드를 출력함.

 

Create - 노드 생성하기 

 

- 배열을 이용하여 "string"으로 노드 구성하기 -

<Linked.h>

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

typedef struct node {
    char value;
    struct node* next_node;
}NODE;

NODE* create_node(char v) {
    NODE* mynode;
    mynode = (NODE*)malloc(sizeof(NODE));  //동적메모리 할당
    mynode->value = v;  //메인함수에서 값 받기
    mynode->next_node = NULL;  //기본값으로 NULL 초기화

    return mynode;  //리턴타입이 void가 아니므로 리턴값이 필요
}

void append_node(NODE* h, NODE* n) {

    struct node *tail;
    if (h == NULL || n == NULL)
        return;
        
    tail = h;
    while (h->next_node != NULL)
        h = h->next_node;

    h->next_node = n;
}

void print(NODE* h) {

    int n = 0;
    while (1) {
        printf("index %d : %c\n", n++, h->value);
        if (h->next_node == NULL)
            break;
        h = h->next_node;
    }
}

 

<Linked.c (메인 함수)>

#include <stdio.h>
#include "Linked01.h"

int main(int argc, char* argv[]) {

    NODE* head;
    NODE* new_node;
    int n = 0;
    
    head = create_node('s');  //head노드를 's'로 선언
    char str[] = "tring";  //배열은 노드를 생성하기 위함
    char c;
  
    while (str[n] != '\0') {
        c = str[n];
        new_node = create_node(c);  //새로운 노드에 배열에 있는 값을 하나씩 넣기
        append_node(head, new_node);  //head노드와 새로운 노드를 append
        n++;
    }

    print(head);

    return 0;
}

 

<콘솔창>

"string"을 각 노드에 추가

 

 Insert - 노드 추가하기 

 

1. 생성된 노드 맨 앞에 새로운 노드 추가하기

<Linked.h>

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

typedef struct node {
    char value;
    struct node* next_node;
}NODE;

NODE* create_node(char v) {
    NODE* mynode;
    mynode = (NODE*)malloc(sizeof(NODE));
    mynode->value = v;
    mynode->next_node = NULL;

    return mynode;
}

void append_node(NODE* h, NODE* n) {

    struct node *tail;
    if (h == NULL || n == NULL)
        return;
        
    tail = h;
    while (h->next_node != NULL)
        h = h->next_node;

    h->next_node = n;
}

NODE* prepend_node(NODE* h, NODE* n) {

    if (h == NULL || n == NULL)
        return h;

    if (n != NULL) {
        n->next_node = h; //새로운 노드의 다음 노드를 head노드로 설정
    }

    return n;
}

void print(NODE* h) {

    int n = 0;
    while (1) {
        printf("index %d : %c\n", n++, h->value);
        if (h->next_node == NULL)
            break;
        h = h->next_node;
    }
}

 

<Linked.c>

#include <stdio.h>
#include "Linked01.h"

int main(int argc, char* argv[]) {

    NODE* head;
    NODE* new_node;
    int n = 0;
    
    head = create_node('s');
    char str[] = "tring";
    char c;
  
    while (str[n] != '\0') {
        c = str[n];
        new_node = create_node(c);
        append_node(head, new_node);
        n++;
    }

    new_node = create_node('x');
    head = prepend_node(head, new_node);
    
    print(head);

    return 0;
}

 

<콘솔창>

'x' 새로운 노드 추가

 

head노드 앞에 새로운 노드 추가

 

2. 생성된 노드 중간에 새로운 노드 추가하기 

<Linked.h>

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

typedef struct node {
    char value;
    struct node* next_node;
}NODE;

NODE* create_node(char v) {
    NODE* mynode;
    mynode = (NODE*)malloc(sizeof(NODE));
    mynode->value = v;
    mynode->next_node = NULL;

    return mynode;
}

void append_node(NODE* h, NODE* n) {

    struct node *tail;
    if (h == NULL || n == NULL)
        return;
        
    tail = h;
    while (h->next_node != NULL)
        h = h->next_node;

    h->next_node = n;
}

//노드 중간에 새로운 노드 넣기 
void insert_node(NODE* h, int a, NODE* n) {
    if (h == NULL || n == NULL)
        return;

    NODE* temp;
    NODE* now;
    now = h;
    if (n != NULL) {
        for (int i = 0; i < a - 1; i++) {
            now = now->next_node;  //새로운 노드를 넣을 자리로 이동
        }
        temp = now->next_node;
        now->next_node = n;
        n->next_node = temp;
    }
}

void print(NODE* h) {

    int n = 0;
    while (1) {
        printf("index %d : %c\n", n++, h->value);
        if (h->next_node == NULL)
            break;
        h = h->next_node;
    }
}

 

<Linked.c>

#include <stdio.h>
#include "Linked01.h"

int main(int argc, char* argv[]) {

    NODE* head;
    NODE* new_node;
    int n = 0;
    
    head = create_node('s');
    char str[] = "tring";
    char c;
  
    while (str[n] != '\0') {
        c = str[n];
        new_node = create_node(c);
        append_node(head, new_node);
        n++;
    }

    new_node = create_node('z');
    insert_node(head, 3, new_node);

    print(head);

    return 0;
}

 

<콘솔창>

노드 사이에 'z'새로운 노드 추가

 

노드 사이에 새로운 노드 추가

 

다음 글에서는 delete_node 함수를 추가하여 Linked List를 설명하겠습니다.

학교에서는 이론으로만 자료구조 수업을 들었는데..

직접 코드를 작성하고, 어떻게 하면 노드끼리 연결될지 생각하는 시간이 가장 중요한 것 같습니다.

감사합니다!

 

2021.08.22