#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
typedef int element;
typedef struct ListNode {
element data;
struct ListNode *llink;
struct ListNode *rlink;
}ListNode;
ListNode *head = NULL;
//노드 생성
ListNode *create_node(element data, ListNode *llink, ListNode *rlink) {
ListNode *new_node;
new_node = (ListNode *)malloc(sizeof(ListNode));
new_node->data = data;
new_node->llink = llink;
new_node->rlink = rlink;
return(new_node);
}
//특정 위치에 노드 삽입
void insert_node(ListNode *p, ListNode *new_node) {
if (head == NULL) {
new_node->llink = NULL;
new_node->rlink = NULL;
head = new_node;
}
else if (p == NULL) {
new_node->llink = NULL;
new_node->rlink = head;
head = new_node;
}
else {
new_node->llink = p;
if (p->rlink != NULL) {
p->rlink->llink = new_node;
new_node->rlink = p->rlink;
}
else {
new_node->rlink = NULL;
}
p->rlink = new_node;
}
}
//데이터가 특정 숫자인 노드 앞에 노드 삽입
void insert_front_node(ListNode *new_node, int data) {
ListNode *p = head;
if (head->data == data) {
new_node->llink = NULL;
new_node->rlink = p;
p->llink = new_node;
head = new_node;
return;
}
while (p->rlink != NULL) {
if (p->rlink->data == data) {
new_node->llink = p;
new_node->rlink = p->rlink;
p->rlink = new_node;
p->rlink->llink = new_node;
return;
}
p = p->rlink;
}
cout << "해당 데이터가 없습니다.";
return;
}
//데이터가 특정 숫자인 노드 뒤에 노드 삽입
void insert_back_node(ListNode *new_node, int data) {
ListNode *p = head;
if (head->data == data) {
new_node->llink = p;
if (p->rlink != NULL)
new_node->rlink = p->rlink;
else
new_node->rlink = NULL;
p->rlink = new_node;
return;
}
while (p != NULL) {
if (p->data == data) {
new_node->llink = p;
if (p->rlink != NULL) {
new_node->rlink = p->rlink;
p->rlink->llink = new_node;
}
else {
new_node->rlink = NULL;
}
p->rlink = new_node;
return;
}
p = p->rlink;
}
cout << "해당 데이터가 없습니다.";
return;
}
//특정 데이터를 가진 노드 삭제
void delete_node(int data) {
if (head == NULL)
return;
ListNode *p = head;
if (p->data == data) {
head = p->rlink;
free(p);
return;
}
while (p->rlink != NULL) {
if (p->rlink->data == data) {
ListNode *delete_node = p->rlink;
p->rlink = delete_node->rlink;
free(delete_node);
return;
}
p = p->rlink;
}
cout << "해당 데이터가 없습니다.";
return;
}
//모든 노드 출력
void print_list() {
ListNode *p = head;
if (p == NULL) {
cout << "nothing";
}
while (p != NULL) {
cout << p->data << " ";
p = p->rlink;
}
}
int main() {
ListNode *list1 = create_node(10, NULL, NULL);
ListNode *list2 = create_node(20, NULL, NULL);
ListNode *list3 = create_node(30, NULL, NULL);
insert_node(NULL, list1);
insert_node(list1, list2);
insert_node(list2, list3);
insert_front_node(create_node(40, NULL, NULL), 20);
insert_back_node(create_node(60, NULL, NULL), 40);
delete_node(20);
print_list();
}