C언어/자료구조

[자료구조 - C언어] Linked List(3) - delete

yujin0517 2021. 8. 23. 16:18

Delete - 노드 삭제하기

 

delete_node : 인덱스 값과 삭제할 노드의 개수를 입력하여 해당 노드를 삭제함.

<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;
}

//delete_node
void delete_node(NODE* h, int a, int num){
	if (h == NULL || h->next_node == NULL)
		return;

    NODE* temp;
    NODE* now;
    now = h;
    
	if(h != NULL && h->next_node != NULL){
        for(int i = 0; i < a - 1; i++){
        	now = now->next_node;
		}
		temp = now->next_node;
		for(int j = 0; j < num; j++){
			now->next_node = now->next_node->next_node;
		}
	}
}

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++;
    }
	
    delete_node(head, 3, 2);
    
    print(head);

    return 0;
}

 

<콘솔창>

index 3부터 2개 노드 삭제

 

'i', 'n' 2개 노드 삭제

 

delete_node 함수에서는 현재 노드의 next_node를 삭제하고, 

삭제할 노드의 next_node를 현재 노드와 연결시키는 것이 가장 중요합니다.

위에서 "now->next_node = now->next_node->next_node;"로 코드를 작성하였고, 삭제되는 노드의 개수만큼 이 코드가 실행되도록 for 반복문을 사용하였습니다. 

앞 글의 insert 코드에서도 for반복문을 사용하여 "now = now->next_node;" 코드를 반복하는 부분이 있었는데 이런 부분은 따로 함수를 만들어서 선언해도 괜찮을 것 같습니다. 

 

감사합니다!

 

2021. 08.23