전공/자료구조
[자료 구조] Doubly Linked List로 Cpp STL List 구현하기
kar7mp5
2024. 4. 5. 01:07
728x90
#include <iostream>
using namespace std;
struct Node {
Node* next;
Node* prev;
int val;
};
class nodeList {
public:
nodeList();
Node* begin();
Node* end();
bool isEmpty();
void insert(Node* pos, const int& _val);
void erase(Node* pos);
bool nextP(Node* pos);
bool prevP(Node* pos);
void findmultiple(const int& val);
private:
Node* header;
Node* trailer;
int size;
};
nodeList::nodeList() {
header = new Node;
trailer = new Node;
header->next = trailer;
trailer->prev = header;
header->prev = trailer->next = nullptr;
size = 0;
}
Node* nodeList::begin() {
return header->next;
}
Node* nodeList::end() {
return trailer;
}
bool nodeList::isEmpty() {
if (size == 0)
return true;
return false;
}
void nodeList::insert(Node* pos, const int& _val) {
Node* newNode = new Node;
newNode->val = _val;
newNode->next = pos;
newNode->prev = pos->prev;
pos->prev->next = newNode;
pos->prev = newNode;
++size;
}
void nodeList::erase(Node* pos) {
if (pos == trailer)
return;
pos->prev->next = pos->next;
pos->next->prev = pos->prev;
delete pos;
--size;
}
bool nodeList::nextP(Node* pos) {
if (pos == trailer)
return false;
return true;
}
bool nodeList::prevP(Node* pos) {
if (pos == header->next)
return false;
return true;
}
void nodeList::findmultiple(const int& val) {
Node* curNode = header->next;
int idx = 0;
bool isExist = false;
while (curNode != trailer) {
if (curNode->val%val == 0) {
isExist = true;
cout << idx << ' ';
}
curNode = curNode->next;
++idx;
}
if (!isExist)
cout << -1 << '\n';
else
cout << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
nodeList* List = new nodeList;
Node* p = List->begin();
int N;
cin >> N;
string input;
while (N--) {
cin >> input;
if (input == "begin") {
p = List->begin();
}
else if (input == "end") {
p = List->end();
}
else if (input == "insert") {
int e;
cin >> e;
List->insert(p, e);
}
else if (input == "erase") {
if (List->isEmpty()) {
cout << "empty" << '\n';
}
else {
List->erase(p);
if (List->nextP(p)) {
p = List->begin();
}
}
}
else if (input == "nextP") {
if (List->nextP(p)) {
p = p->next;
}
}
else if (input == "prevP") {
if (List->prevP(p)) {
p = p->prev;
}
}
else if (input == "findmultiple") {
int e;
cin >> e;
List->findmultiple(e);
}
}
return 0;
}
728x90