'delete node'에 해당되는 글 1건

  1. 2016.07.05 [c언어] 링크드 리스트(Linked list)의 구현 2

링크드 리스트 자료구조에서 구현해야할 부분은 자료의 삽입, 삭제, 프린트입니다.

지난번에는 자료의 입력과 프린트만 구현했었는데, 이번엔

자료를 지우기, 자료를 특정 위치에 넣기, 자료의 순서를 반대로 하기 함수를 추가하도록 하는

코드를 올려봅니다.


그리고... 지난번에 소개한 글처럼 head node를 global값으로 사용한 방식이므로, 

아래 링크 : 링크드 리스트의 3가지 표현 방법 을 보시면, global값에서 지역 변수 등으로 사용하는 방법이 소개되니 참고하세요.

http://hamji.tistory.com/130


Null 포인터에 접근하지 않도록 하는 오류 방지 코드가 없이 기능만 구현하였기에, 참고 바랍니다.

안정성 있는 코드가 되려면, 오류 방지도 생각을 해야겠지요.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <stdio.h>
#include <stdlib.h>
 
typedef struct _Node {
    int data;
    struct _Node *next;
}Node;
 
Node *head;
 
void insert_node(int data, int n);
void delete_node(int n);
void insert_front(int data);
void insert_rear(int data);
void print_node(void);
void reverse_node(void);
 
void insert_node(int data, int n) {
    Node *node = malloc(sizeof(Node));
    node->data = data;
    node->next = NULL;
    
    if (n == 1) { // 맨앞에 넣기
        node->next = head;
        head = node;
        return;
    }
    Node *cur = head;
    
    for (int i = 0; i < n - 2; i++) {
        cur = cur->next;
    }
    node->next = cur->next;
    cur->next = node;
    return;
}
// 특정 위치에 값을 넣기 
void delete_node(int n){
    Node * cur = head;
 
    if (n == 1) {
        head = cur->next;
        free(cur);
        return;
    }
 
    for (int i = 0; i < n - 2; i++) {
        cur = cur->next;    
    }
    Node *temp = cur->next; 
    cur->next = cur->next->next;
    free(temp);
}
 // 맨 앞에 자료를 넣기
void insert_front(int data) {
    int n = 1;
    insert_node(data, n);
}
 // 맨 뒤에 자료를 넣기
void insert_rear(int data) {
    Node *node = malloc(sizeof(Node));
    node->next = NULL;
    node->data = data;
 
    Node *cur = head;
    while (cur->next != NULL) {
        cur = cur->next;
    }
    cur->next = node;
}
 
void print_node(void) {
    Node*cur = head;
 
    for (int i = 0; cur != NULL; i++) {
        printf("[%2d]->", cur->data);
        cur = cur->next;
    }
    printf("\n");
}
 // 자료의 순서를 반대로 하기
void reverse_node(void) {
    Node *current, *prev, *next;
    current = head;
    prev = NULL;
    
    while (current != NULL) {
        next = current->next;
        current->next = prev;
        prev = current;
        current = next;
    }
    head = prev;
}
 
void main(void) {
 
    insert_node(11);
    insert_node(22);
    insert_node(33);
    insert_node(44);
    print_node();
 
    insert_node(53);
    insert_node(62);
    insert_node(71);
    print_node();
    
    insert_rear(11);
    insert_rear(12);
    insert_rear(13);
    insert_rear(14);
    print_node();
 
    delete_node(1);
    delete_node(3);
    delete_node(5);
    print_node();
 
    reverse_node();
    print_node();
}
 
cs


Posted by 고무함지
,