본문 바로가기

C++

[C++] 이중 연결 리스트 생성, 삽입, 삭제, 출력 코드 구현

#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();
}