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");
}
}