kar7mp5

[자료 구조] Doubly Linked List - 2 본문

전공/자료구조

[자료 구조] Doubly Linked List - 2

kar7mp5 2024. 4. 5. 03:07
728x90
#include <iostream>

using namespace std;

struct node
{
    int data;
    node *prev;
    node *next;
};

class nodeList
{
public:
    nodeList();
    int size();
    node *begin();
    void insert(node *pos, int data);
    void erase(node *pos);
    bool isHeader(node *pos);
    bool isTrailer(node *pos);

private:
    node *header;
    node *trailer;
    int n;
};

nodeList::nodeList()
{
    header = new node();
    trailer = new node();
    header->data = 0;
    trailer->data = 0;
    header->next = trailer;
    trailer->prev = header;
    header->prev = trailer->next = NULL;
    n = 0;
}

int nodeList::size()
{
    return n;
}

node *nodeList::begin()
{
    return header->next;
}

void nodeList::insert(node *pos, int data)
{
    node *newNode = new node();
    newNode->data = data;
    newNode->prev = pos->prev;
    newNode->next = pos;
    pos->prev->next = newNode;
    pos->prev = newNode;
    n++;
}

bool nodeList::isHeader(node *pos)
{
    if (pos == header->next)
    {
        return false;
    }
    else
    {
        return true;
    }
}

bool nodeList::isTrailer(node *pos)
{
    if (pos == trailer)
    {
        return false;
    }
    else
    {
        return true;
    }
}

int main()
{
    int T;
    cin >> T;

    while (T--)
    {
        nodeList *list = new nodeList();
        node *p = list->begin();

        int currentIndex{0};

        int N;
        cin >> N;
        while (N--)
        {
            int x;
            cin >> x;
            list->insert(p, x);
        }

        p = list->begin();

        int M;
        cin >> M;
        while (M--)
        {
            int x;
            cin >> x;

            if (x > 0)
            {
                while (x--)
                {
                    if (list->isTrailer(p))
                    {
                        p = p->next;
                        currentIndex++;
                    }
                }
                int nodeData = p->data;
                if(nodeData > 0){
                    while(nodeData--){
                        if(list->isTrailer(p)){
                            p = p->next;
                            currentIndex++;
                        }
                    }
                }
                else{
                    while(nodeData++){
                        if(list->isHeader(p)){
                            p = p->prev;
                            currentIndex--;
                        }
                    }
                }
            }
            else if (x < 0)
            {
                while (x++)
                {
                    if (list->isHeader(p))
                    {
                        p = p->prev;
                        currentIndex--;
                    }
                }
                int nodeData = p->data;
                if(nodeData > 0){
                    while(nodeData--){
                        if(list->isTrailer(p)){
                            p = p->next;
                            currentIndex++;
                        }
                    }
                }
                else{
                    while(nodeData++){
                        if(list->isHeader(p)){
                            p = p->prev;
                            currentIndex--;
                        }
                    }
                }
            }
            else{
                int nodeData = p->data;
                if(nodeData > 0){
                    while(nodeData--){
                        if(list->isTrailer(p)){
                            p = p->next;
                            currentIndex++;
                        }
                    }
                }
                else{
                    while(nodeData++){
                        if(list->isHeader(p)){
                            p = p->prev;
                            currentIndex--;
                        }
                    }
                }
            }
        }

        cout<<p->data<<endl;
    }

    return 0;
}
728x90