1. 그림
2. 전체 코드
DoubleLinkedList.h
#ifndef DOUBLE_LINKED_LIST
#define DOUBLE_LINKED_LIST
#include<malloc.h>
struct Node {
int data;
Node* prev; // 양방향 연결을 위해 prev 추가
Node* next;
};
class DoubleLinkedList {
private:
Node* head;
Node* tail; // 후방삽입을 위한 tail Node 추가
public:
DoubleLinkedList();
Node* getHead() { return head; }
Node* getTail() { return tail; }
Node* createNode(int data);
void pushFront(int data);
void pushBack(int data); // 후방삽입 기능 추가
void removeNode(int data);
void removeAllNodes();
};
#endif // DOUBLE_LINKED_LIST
DoubleLinkedList.cpp
#include "DoubleLinkedList.h"
DoubleLinkedList::DoubleLinkedList() {
head = createNode(0);
tail = createNode(0);
head->next = tail;
tail->prev = head;
}
Node* DoubleLinkedList::createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
void DoubleLinkedList::pushFront(int data) {
Node* newNode = createNode(data);
newNode->prev = head;
newNode->next = head->next;
head->next->prev = newNode;
head->next = newNode;
}
void DoubleLinkedList::pushBack(int data) {
Node* newNode = createNode(data);
newNode->prev = tail->prev;
newNode->next = tail;
tail->prev->next = newNode;
tail->prev = newNode;
}
void DoubleLinkedList::removeNode(int data) {
Node* cur = head->next;
while (cur != tail) {
if (cur->data == data) {
Node* deleteNode = cur;
cur->prev->next = cur->next;
cur->next->prev = cur->prev;
cur = cur->next;
free(deleteNode);
}
else
cur = cur->next;
}
}
void DoubleLinkedList::removeAllNodes() {
Node* cur = head;
while (cur != NULL) {
Node* temp = cur;
cur = cur->next;
free(temp);
}
head = NULL;
}
main.cpp
#include<iostream>
#include "DoubleLinkedList.h"
using namespace std;
void printLinkedList(DoubleLinkedList* linkedList) {
printf("[dmy head]<->");
Node* cur = linkedList->getHead()->next;
for (; cur != linkedList->getTail(); cur = cur->next)
printf("%d<->", cur->data);
printf("[dmy tail]\n");
}
int main() {
DoubleLinkedList doubleLinkedList;
printLinkedList(&doubleLinkedList); // [dmy head]<->[dmy tail]
doubleLinkedList.pushFront(3);
doubleLinkedList.pushFront(2);
doubleLinkedList.pushFront(1);
doubleLinkedList.pushBack(4);
doubleLinkedList.pushBack(5);
printLinkedList(&doubleLinkedList); // [dmy head]<->1<->2<->3<->4<->5<->[dmy tail]
doubleLinkedList.removeNode(3);
printLinkedList(&doubleLinkedList); // [dmy head]<->1<->2<->4<->5<->[dmy tail]
doubleLinkedList.removeNode(1);
printLinkedList(&doubleLinkedList); // [dmy head]<->2<->4<->5<->[dmy tail]
doubleLinkedList.removeNode(2);
doubleLinkedList.removeNode(4);
doubleLinkedList.removeNode(5);
printLinkedList(&doubleLinkedList); // [dmy head]<->[dmy tail]
doubleLinkedList.removeAllNodes();
return 0;
}
'개발하고 > 자료구조' 카테고리의 다른 글
[DS] Linked List 구현(2) - Single Linked List(with Dummy) (0) | 2021.07.29 |
---|---|
[DS] Linked List 구현(1) - Single Linked List (0) | 2021.07.25 |
[DS] Linked List (0) | 2021.06.21 |
[DS] Binary Tree (0) | 2021.06.13 |