사용된 함수
- 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;
}
<콘솔창>
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;
}
<콘솔창>
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;
}
<콘솔창>
다음 글에서는 delete_node 함수를 추가하여 Linked List를 설명하겠습니다.
학교에서는 이론으로만 자료구조 수업을 들었는데..
직접 코드를 작성하고, 어떻게 하면 노드끼리 연결될지 생각하는 시간이 가장 중요한 것 같습니다.
감사합니다!
2021.08.22
'C언어 > 자료구조' 카테고리의 다른 글
[자료구조 - C언어] 재귀함수(Recursion) - Factorial, fib, Hanoi (0) | 2021.08.31 |
---|---|
[자료구조 - C언어] 큐(Queue) (0) | 2021.08.25 |
[자료구조 - C언어] 스택(Stack) (0) | 2021.08.24 |
[자료구조 - C언어] Linked List(3) - delete (0) | 2021.08.23 |
[자료구조 - C언어] Linked List (0) | 2021.08.19 |