전공/자료구조

[자료 구조] 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