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 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 | #include <stdio.h> #include <stdlib.h> typedef struct _node { int key; struct _node *next; } node; #define success 1 #define fail 0 node *init_node( void ); //head와 tail node의 초기화 node *delete_all( node *head ); // head와 tail을 제외한 모든 node 삭제 node *find_key( node *head, int s_key ); // 주어진 key값으로 node탐색 int insert_node( node *head, int i_key ); // head와 첫번째 node사이 삽입 int delete_node( node *node_n ); // 주어진 node의 다음 node 삭제 int insert_key( node *head, int f_key, int i_key ); // 주어진 key값의 node 새로운 node 삽입 int delete_key( node *head, int d_key ); // 주어진 key값의 노드삭제 void print_node( node *head ); // node 출력 // 구현해야할 함수 // oscending_node() 오름차순정렬 // descending_node() 내림차순 정렬 int main( int argc, char **argv ) { int result = 0; node *temp = NULL; node *head = init_node(); fputs ( "Insert Node 1 to 10\n" , stdout ); insert_node( head, 10 ); insert_node( head, 9 ); insert_node( head, 8 ); insert_node( head, 7 ); insert_node( head, 6 ); insert_node( head, 5 ); insert_node( head, 4 ); insert_node( head, 3 ); insert_node( head, 2 ); insert_node( head, 1 ); print_node( head ); fputs ( "Finding key 5\n" , stdout ); temp = find_key( head, 5 ); printf ( "Finding 5 is %ssuccessful\n" , temp == NULL ? "un" : "" ); fputs ( "Insert key 11 after 3\n" , stdout ); insert_key( head, 3, 11 ); print_node( head ); fputs ( "Delete key 10\n" , stdout ); delete_key( head, 10 ); print_node( head ); fputs ( "Finding key 3 and Delete next node\n" , stdout ); temp = find_key( head, 3 ); delete_node( temp ); print_node( head ); fputs ( "Delete key 7\n" , stdout ); delete_key( head, 7 ); print_node( head ); fputs ( "Delete all node\n" , stdout ); delete_all( head ); print_node( head ); return 0; } node *init_node( void ) { node *head = (node *) malloc ( sizeof (node) ); // head node initialization node *tail = (node *) malloc ( sizeof (node) ); // tail node initialization if ( head == NULL ) // Head Node에 대해 할당에 실패했을때 { fputs ( "Failed to allocate for Head node\n" , stdout ); return NULL; } if ( tail == NULL ) // Tail Node에 대해 할당에 실패했을때 { fputs ( "Failed to allocate for tail node\n" , stdout ); free ( head ); // Tail Node에 대해 할당에 실패했을 땐, Head Node를 해제 return NULL; } head->next = tail; tail->next = NULL; return head; } node *delete_all( node *head ) { node *navi_node = head->next; // 순회노드 선언 및 head 다음으로 설정 node *free_node = NULL; // 해제노드 선언 while ( navi_node->next != NULL ) // 순회노드가 tail에 이를때까지 { free_node = navi_node; navi_node = navi_node->next; free ( free_node ); } head->next = navi_node; // navi_node 가 성공적으로 루프를 종료했다면 tail return head; } node *find_key( node *head, int s_key ) { node *navi_node = head->next; // head 다음노드로 설정 while ( navi_node->key != s_key && navi_node->next != NULL ) // key값을 찾거나 꼬리에 이를때까지 // { navi_node = navi_node->next; } if ( navi_node->key == s_key ) // key값을 찾았을경우 { return navi_node; } else if ( navi_node->next == NULL ) // 꼬리일경우 { fputs ( "Node is tail\n" , stdout ); return NULL; } } int insert_node( node *head, int i_key) { node *i_node = NULL; // 삽입노드 선언 i_node = (node *) malloc ( sizeof (node) ); // 삽입노드 할당 if ( i_node == NULL ) { fputs ( "Failed to allocate for Insert Node\n" , stdout ); return fail; } i_node->key = i_key; i_node->next = head->next; head->next = i_node; return success; } int delete_node( node *node_d) { node *delete_node = node_d->next; // 삭제노드 선언 및 node_next다음노드로 설정 if ( delete_node->next == NULL ) { fputs ( "Next node is tail.\n" , stdout ); return fail; } node_d->next = delete_node->next; free ( delete_node ); return success; } int insert_key( node *head, int f_key, int i_key ) { node *i_node = NULL; node *s_node = head->next; // 탐색노드 while ( s_node->next != NULL && s_node->key != f_key ) // key값을 찾거나 꼬리에 도달할때까지 { s_node = s_node->next; } if ( s_node->key == f_key ) // key값일경우 { i_node = (node *) malloc ( sizeof (node) ); if ( i_node == NULL ) // 할당에 실패했을때 { fputs ( "Failed to allocate for Insert node\n" , stdout ); return fail; } i_node->next = s_node->next; i_node->key = i_key; s_node->next = i_node; return success; } else if ( s_node->next == NULL ) // 꼬리일경우 { fputs ( "Search node is tail.\n" , stdout ); return fail; } } int delete_key( node *head, int d_key ) { node *s_node = head->next; // 탐색노드 node *p_node = head; // 탐색노드를 따라갈 이전노드 while ( s_node->next != NULL && s_node->key != d_key ) // key값을 찾거나 꼬리에 도달할때까지 { s_node = s_node->next; p_node = p_node->next; } if ( s_node->key == d_key ) // key값일경우 { p_node->next = s_node->next; free ( s_node ); return success; } else if ( s_node->next == NULL ) // 꼬리일경우 { fputs ( "Search node is tail.\n" , stdout ); return fail; } } void print_node( node *head ) { node *c_node = head->next; // 탐색노드 int index_node = 0; // 노드 개수 printf ( "--------------------------------------------------\n" ); while ( c_node->next != NULL ) { index_node++; fprintf (stdout, "%2dth Node key value : %2d\n" , index_node, c_node->key ); c_node = c_node->next; } printf ( "--------------------------------------------------\n" ); } } |