연결리스트(Linked list) 노드 삽입 - C 언어

2021. 4. 9. 21:51·C
728x90
반응형

2021.04.09 - [C/자료구조] - [자료구조] C언어 연결리스트(Linked list) 생성 / 출력

 

[자료구조] C언어 연결리스트(Linked list) 생성 / 출력

연결리스트 만들기 "월" "화" "수" "목" "금" 등 요일을 데이터값으로 갖는 연결리스트를 만들어보자. typedef struct node {         char data;         struct node* next;     } ..

tildacoderecorder.tistory.com

 

*이 글의 예제는 연결리스트의 생성과 출력에 대해 요약한 전 글과 같은 구조체를 사용.

 

연결리스트의 첫 번째 노드로 삽입하기

char val의 값은 전 글에서 말했듯이 "월"으로 한다.

 

typedef struct node {
    char data;
    struct node* next;
} Node;
 
Node* head;
 
void insert1(char val) {
 
    Node* tmp;
    tmp = (Node*)malloc(sizeof(Node));
    tmp->data = val;
    tmp->next = head;
    head = tmp;
 
}
Colored by Color Scripter
cs

 

먼저 구조체 포인터 변수인 tmp를 만들고 새로운 노드를 생성해주기 위해 malloc으로 메모리를 할당해준다.

tmp->data에는 첫번째 노드에 들어갈 데이터 값val을 넣어주고, tmp->next에는 head값을 담는다.

head는 node1을 가리키고 있기 때문에 이 head값을 담은 tmp또한 node1을 가리키게 된다.

하지만 head는 모든 노드의 가장 맨 앞에서 첫번째 노드를 가리켜야 하므로, 첫번째 노드로 삽입하려는 tmp를 가리키도록 한다. head = tmp

 

 

원리를 그림으로 그리자면 위와 같다. tmp를 성공적으로 head 와 node1 사이에 넣은 것을 알 수 있다.

 

 

연결리스트의 중간에 노드 삽입하기

pre 노드가 주어졌을 때 이 노드 뒤에 삽입하는 방법

void insert(char val, Node* pre) {
    Node* tmp;
    tmp = (Node*)malloc(sizeof(Node));
    tmp->data = val;
    if (head == NULL) {
        head = tmp;
        tmp->next = NULL;
    }
    else {
        tmp->next = pre->next;
        pre->next = tmp;
    }
}
 
Colored by Color Scripter
cs

 

위에서 설명한 것과 비슷하게 먼저 구조체 포인터 변수 tmp를 생성하고 메모리 할당을 해준다.

tmp->data에 데이터 val을 넣고, head가 NULL이면 tmp가 첫번째 노드가 되므로 head가 tmp를 가리키게 한다.

head가 NULL이 아니라면 tmp는 pre->next의 값을 가지게 되는데 pre->next는 pre노드의 다음 노드를 가리키고 있었으므로 tmp는 그 노드를 가리키게 된다.

이 부분은 그림과 같이 보면 이해가 쉽다.

 

기존의 연결리스트의 구조는 왼쪽과 같다. pre노드가 그 다음 노드를 가리키고 있고, tmp라는 새 노드를 pre노드 뒤에 넣으려는 상황이다.

pre->next는 그 다음 노드를 가리키고 있으므로 tmp->next = pre->next 를 하게 되면 tmp는 pre 다음 노드를 가리키게 된다. (오른쪽 그림)

여기서 pre->next = tmp를 하게되면 pre노드는 tmp를 가리키므로 두 노드 사이에 tmp노드가 잘 삽입되었음을 알 수 있다. 

 

연결리스트의 마지막에 노드 삽입하기

마지막 노드를 찾고 그 뒤에 노드 삽입하는 방법

void insert2(char val) {
    Node* tmp, * ptr;
    tmp = (Node*)malloc(sizeof(Node));
    tmp->data = val;
    tmp->next = NULL;
    if (head == NULL) {
        head = tmp;
        return;
    }
    ptr = head;
    while (ptr->next != NULL)
        ptr = ptr->next;
    ptr->next = tmp;
}
 
Colored by Color Scripter
cs

 

삽입할 노드 tmp를 메모리 할당하여 생성, if문을 이용해 head가 NULL일 경우 바로 tmp를 가리키도록 해준다.

tmp에 데이터 값 val을 넣어주고 포인터 값은 아직 모르니 NULL을 넣어준다.

 

이제 마지막 노드를 찾을 while문을 돌 구조체 포인터 변수 ptr을 만들어 head를 가리키게 한다.

원리를 그림으로 보자면 다음과 같다.

 

1. ptr = head일 때, ptr->next는 node1을 가리킨다. node1은 NULL이 아니기 때문에 그대로 while문을 돌아 ptr = ptr->next로 다음 노드를 가리키게 된다.

2. ptr은 현재 node2를 가리킨다. ptr->next인 node3 또한 NULL값이 아니므로 while을 돌아 다음 노드를 가리키게 된다.

3. ptr은 node3를 가리키며 node3->next가 NULL이므로 while을 돌지 못하고 종료된다. 최종적으로 ptr은 마지막 노드인 node3을 가리키게 된다.

 

삽입할 노드 tmp는 마지막 노드인 node3 뒤에 와야하기 때문에 node3->next가 tmp를 가리키면 된다.

이렇게 마지막 노드를 삽입할 수 있다.

 

 

 

참조 : C로 배우는 쉬운 자료구조 / 이지영 / 한빛아카데미

728x90
반응형
저작자표시 비영리 변경금지 (새창열림)

'C' 카테고리의 다른 글

선형 리스트 삽입/삭제/탐색/종료 - C 언어  (0) 2021.04.16
연결리스트(Linked list) 노드 삭제 - C 언어  (0) 2021.04.09
연결리스트(Linked list) 마지막에서 두번째 데이터 출력 - C 언어  (0) 2021.04.09
연결리스트(Linked list) 생성 / 출력 - C 언어  (0) 2021.04.09
포인터를 이용한 swap 함수 만들기 - C 언어  (0) 2021.03.03
'C' 카테고리의 다른 글
  • 선형 리스트 삽입/삭제/탐색/종료 - C 언어
  • 연결리스트(Linked list) 노드 삭제 - C 언어
  • 연결리스트(Linked list) 마지막에서 두번째 데이터 출력 - C 언어
  • 연결리스트(Linked list) 생성 / 출력 - C 언어
waVwe
waVwe
    반응형
  • waVwe
    waVwe 개발 블로그
    waVwe
  • 전체
    오늘
    어제
    • ALL (184)
      • Python (1)
      • Spring (15)
      • DevOps (10)
      • Git (6)
      • JAVA (4)
      • C (22)
      • 코테 문제 풀이 (124)
        • 프로그래머스 (43)
        • 백준 (2)
        • 정올 (64)
        • SW Expert Academy (1)
        • 온코더 oncoder (14)
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

    • 🐙 Github
  • 공지사항

  • 인기 글

  • 태그

    형변환
    알고리즘
    자료구조
    코테
    깃헙
    CI/CD
    스프링부트
    Til
    docker
    스프링
    MSA
    java
    내일배움캠프
    깃
    아파치카프카
    progate
    이진트리
    C
    자바
    springboot
    devops
    스파르타코딩
    C언어
    프로그래머스
    도커
    스파르타코딩클럽
    while문
    온코더
    연결리스트
    정올
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
waVwe
연결리스트(Linked list) 노드 삽입 - C 언어
상단으로

티스토리툴바