C 자료구조와 알고리즘

연결리스트(중간 노드 삽입 삭제) 이중포인터 버전

june__Park 2021. 6. 29. 18:58
// 연결리스트(중간 노드 삽입 삭제) 이중포인터 버전
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>

typedef struct node {
	int data;
	struct node* next;
} NODE;


NODE* head = NULL;

NODE* init(int data){
	NODE* tmp = (NODE*)malloc(sizeof(NODE));
	tmp->data = data;
	tmp->next = NULL;
	return tmp;
}

void add(NODE** head_addr, int prev, int data){
	while(*head_addr) {
		if((*head_addr)->data == prev){
			NODE* new_node = init(data);
			new_node->next = *head_addr;
			*head_addr = new_node;
			return;
		}
		head_addr = &(*head_addr)->next;
	}
	if(prev == -1){
		*head_addr = init(data);
		return;
	}

	printf("%d(은)는 미등록 원소입니다. \n", prev);
}

void remove(NODE** head_addr, int data){
	if(!*head_addr){
		printf("%d(은)는 미등록 원소입니다. \n", data);
		return;
	}
	if((*head_addr)->data == data){
		NODE* target = *head_addr;
		*head_addr = target->next;
		free(target);
		return;
	}
	else {
		remove(&(*head_addr)->next, data);
	}
}
NODE* search(int data){
	// data 노드 찾기 
	// 있으면 해당 노드의 주소 return 
	// 없으면 NULL return 
	NODE* tmp = head;
	while(tmp){
		if(tmp->data == data){

			return tmp;
		}
		tmp = tmp->next;
	}
	
	return NULL;
}
void print_all(){
	// 모든 노드 출력
	NODE* tmp = head;
	while(tmp){
		printf("%d ", tmp->data);
		tmp = tmp->next;
	}
	printf("\n");
}
void main(){
	int data, select, prev;
	NODE* result;

	while(1){
		print_all();
		printf("1. 추가 \n2. 삭제 \n3. 검색 \n0. 종료 \n입력:");
		scanf_s("%d", &select);
		switch(select){
		case 1: 
			printf("새 정수 : ");
			scanf_s("%d", &data);
			printf("어느 노드 앞에 추가 ? (마지막 -1) : ");
			scanf_s("%d", &prev);

			add(&head, prev, data);
			break;

		case 2: 
			printf("삭제할 정수를 입력하세요...\n");
			scanf_s("%d", &data);
			remove(&head, data);
			break;
		case 3: 
			printf("검색할 정수를 입력하세요..\n");
			scanf_s("%d", &data);
			result = search(data);
			if(result){
				printf("%d(은)는 있습니다. \n", data);
			}
			else{
				printf("%d(은)는 미등록 노드입니다. \n", data);
			}
			break;
		case 0: 
			exit(0);
		}
		system("pause");
		system("cls");
	}
}

이차원포인터