C/동적할당
노드
june__Park
2021. 3. 29. 16:58
#include <stdio.h>
#include <Windows.h> // exit(), system()
typedef struct Node {
int data;
struct Node* next;
} NODE;
NODE* head = NULL;
void print_all(){
NODE* tmp = head;
while(tmp){
printf("%d ", tmp->data);
tmp = tmp->next;
}
}
/*
init() : NODE를 생성하고, 초기화해준 다음, 그 주소를 return
인자값 : int data
리턴값 : 새 노드의 주소
*/
NODE* init(int data){
NODE* tmp =(NODE*)malloc(sizeof(NODE));
tmp->data = data;
tmp->next = NULL;
return tmp;
}
/*
int remove(int data) : 리스트의 data를 찾아, 해당 노드를 삭제 (단, 연결 유지!)
삭제 성공 : return 1
삭제 실패 : return 0 (<== 삭제할 원소가 리스트에 없을 때)
*/
int remove(int data){
// 1. data 노드를 찾는다.
// 2. head? / 중간 노드? / 마지막 노드?
NODE* tmp = head;
if(tmp -> data == data){
head = tmp->next;
free(tmp);
return 1;
}
while(tmp->next){
if(tmp->next->data == data){
NODE* target = tmp->next;
tmp->next=tmp->next->next;
free(target);
return 1;
}
tmp = tmp->next;
}
// 3. 연결해주고 free()
return 0;
}
int remove2(NODE** node, int data){
// 더블포인터 사용
if(!*node){
return 0;
}
if((*node)->data == data){
*node = (*node)->next;
return 1;
}
return remove2(&(*node)->next, data);
}
/*void add(int data){
// NODE* tmp =(NODE*)malloc(sizeof(NODE));
// tmp->data = data;
// tmp->next = NULL;
NODE* tmp = init(data);
if (!head) { // head == NULL // 최초 노드 추가?
head = tmp;
return;
}
NODE* tmp2 = head;
while(tmp2->next){ // tmp2->next가 NULL 이 아닐동안
tmp2 = tmp2->next;
}
tmp2->next = tmp;
}*/
void add(int data){
NODE** tmp = &head;
while(*tmp){
tmp = &(*tmp)->next;
}
*tmp = (NODE*)malloc(sizeof(NODE));
(*tmp)->data = data;
(*tmp)->next = NULL;
}
void main(){
int data;
int select;
while(1){
printf("1. 노드 추가\n");
printf("2. 노드 모두 보기 \n");
printf("3. 노드 삭제 \n");
printf("0. 종료하기 \n");
printf("선택 : "); scanf_s("%d", &select);
if(select == 1){
printf("새 노드 : "); scanf_s("%d", &data);
add(data);
}
else if(select == 2){
printf("--- 노드 리스트 ---\n");
print_all(); // HEAD 부터 마지막 노드까지를 모두 출력
}
else if(select == 3){
printf("삭제할 노드 : "); scanf_s("%d", &data);
if(remove(data)){ // remove2(&head, data)
printf("삭제 성공! \n");
}
else {
printf("삭제 실패..\n");
}
}
else if(select == 0){
printf("프로그램 종료 \n");
exit(0); // 프로그램 종료
}
else{
printf("다시 입력하세요.\n");
}
system("pause"); // 엔터 입력 될 때까지 화면 정지
system("cls");
} // while
}