#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
}Node;
typedef struct Double_Linkedlist {
Node* head;
}Double_Linkedlist;
void init(Double_Linkedlist* list);
void insert_Node(Double_Linkedlist* list, int data);
void delete_Node(Double_Linkedlist* list, int data);
void print_Linkedlist(Double_Linkedlist* list);
bool search_Node(Double_Linkedlist* list, int data);
int main() {
Double_Linkedlist* linked_list;
init(&linked_list);
while (true)
{
int data;
int choice;
printf("1.Insert Node \\t2.Delete Node \\t3.Search Data \\t4.Print Double Linked List \\t5.Initialize \\t6.Exit\\n");
printf("Selection choice: ");
scanf_s("%d", &choice);
switch (choice)
{
case 1: //Insert
printf("삽입할 데이터를 알려주세요. > ");
scanf("%d", &data);
insert_Node(&linked_list, data);
break;
case 2: //Delete
printf("삭제할 데이터를 알려주세요. > ");
scanf("%d", &data);
delete_Node(&linked_list, data);
break;
case 3: //Search
printf("검색할 데이터를 알려주세요. > ");
scanf("%d", &data);
if (search_Node(&linked_list, data)) {
printf("데이터 %d가 현재 list에 존재합니다.\\n\\n", data);
}
else {
printf("데이터 %d가 현재 list에 존재하지 않습니다.\\n\\n", data);
}
break;
case 4: //Print list
printf("현재 list에 있는 데이터는 아래와 같습니다.\\n");
print_Linkedlist(&linked_list);
break;
case 5: //Initialize
init(&linked_list);
printf("현재 list를 초기화 했습니다.\\n\\n");
break;
case 6:
printf("프로그램을 종료하겠습니다.");
return 0;
}
}
}
void init(Double_Linkedlist* list) {
list->head = NULL;
}
void insert_Node(Double_Linkedlist* list, int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
if (list->head == NULL) {
list->head = newNode;
printf("데이터 \\'%d\\'을 삽입했습니다.\\n\\n", data);
return;
}
Node* current = list->head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
newNode->prev = current;
printf("데이터 \\'%d\\'을 삽입했습니다.\\n\\n", data);
}
void delete_Node(Double_Linkedlist* list, int data) {
Node* curr = list->head;
while (curr != NULL)
{
if (curr->data == data) {
if (curr->prev != NULL) {
curr->prev->next = curr->next;
}
else {
list->head = curr->next;
}
if (curr->next != NULL) {
curr->prev->next = curr->prev;
}
printf("데이터 \\'%d\\'을 삭제했습니다.\\n\\n", data);
free(curr);
return;
}
curr = curr->next;
}
}
void print_Linkedlist(Double_Linkedlist* list) {
Node* curr = list->head;
while (curr != NULL) {
printf("%d -> ", curr->data);
curr = curr->next;
}
printf("NULL \\n\\n");
}
bool search_Node(Double_Linkedlist* list, int data) {
Node* curr = list->head;
while (curr != NULL) {
if (curr->data == data) {
return true;
}
curr = curr->next;
}
return false;
}