#include <stdio.h>
#include <stdlib.h> //malloc 헤더 파일
typedef struct _Node{ //구조체 이름 _Node
int data;
struct _Node* next;
} Node; // 구조체 별칭 Node
// function declaration
Node* create_node(int);
Node* find_node(Node*, int);
void insert_node(Node**, int, unsigned);
void delete_node(Node**, int);
void delete_all(Node**);
void print(Node*);
#include "linked_list.h"
// function definition
Node* create_node(int value){
Node* new_node = (Node*)malloc(sizeof(Node));
new_node->data = value;
new_node->next = NULL;
return new_node;
}
// 필요한가?
Node* find_node(Node* head, int value){
for (Node* p = head; p!= NULL; p = p->next){
if (p->data ==value){
return p;
}
}
return NULL;
}
// 해당 position에 새로운 node insert
void insert_node(Node** head_ptr, int value, unsigned pos){
Node* new_node = create_node(value);
// head_ptr은 head의 주소값을 가지는 pointer의 pointer
// 맨 앞에 연결해 주어야할떄
if (pos == 0){
new_node->next = *head_ptr;
*head_ptr = new_node;
return;
}
// p는 head의 주소값을 받는거임
Node* p = *head_ptr;
for (int idx = 0; idx < pos -1 && p->next != NULL; idx++, p = p->next);
// for loop에서 가져온 p 뒤에 연결해주면 됨
new_node->next = p->next;
p->next = new_node;
}
// delete 할 시에는 포인터 두개잡고 prev node도 들고 있어야됨
void delete_node(Node** head_ptr, int value){
Node* prev_node = NULL;
Node* curr_node = *head_ptr;
for (curr_node; curr_node->data != value && curr_node!= NULL;){
prev_node = curr_node;
curr_node = curr_node->next;
}
if (curr_node != NULL){
if (curr_node == *head_ptr)
*head_ptr = (*head_ptr)->next;
else
prev_node->next = curr_node->next;
free(curr_node);
}
}
// 싹다 지워주는 함수
void delete_all(Node** head){
//base case
if (*head == NULL)
return;
delete_all(&((*head)->next));
// printf("%d", head->data);
free(*head);
*head = NULL;
}
// Head 부터 출력해주는 함수
void print(Node* head){
Node* p = head;
while (p != NULL){
printf("%d ", p->data);
p = p->next;
}
printf("\\n");
}
#include "linked_list.h"
// gcc linked_list.c main.c -o main
int main(){
// head는 첫번째 node를 가리키는 struct pointer임
Node* head = create_node(0);
insert_node(&head, 1, 1);
insert_node(&head, 1, 3);
printf("%d: ", 1); print(head);
delete_node(&head, 0);
printf("%d: ", 2); print(head);
insert_node(&head, 5, 2);
insert_node(&head, 7, 0);
delete_node(&head, 5);
printf("%d: ", 3); print(head);
delete_all(&head);
printf("%d: ", 4);
print(head);
return 0;
}
Output
1: 0 1 1 2: 1 1 3: 7 1 1 4: