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 
}