Dia 9 – Primeira versão da fila circular duplamente encadeada

Buscando me aprofundar em C++, comecei a fazer as primeiras tasks do meu sistema operacional (jfcOS). Estou usando esse material de estudo: PingPongOS do Prof. Carlos Maziero.
Ele também tem um livro super interessante sobre SO. Vale a pena dar uma olh…


This content originally appeared on DEV Community and was authored by Matheus Gomes ?‍?

Buscando me aprofundar em C++, comecei a fazer as primeiras tasks do meu sistema operacional (jfcOS). Estou usando esse material de estudo: PingPongOS do Prof. Carlos Maziero.
Ele também tem um livro super interessante sobre SO. Vale a pena dar uma olhada.

Comecei meu projeto fazendo a minha primeira versão de uma fila circular duplamente encadeada. Meu código ainda não atende todas as especificidades relatadas no material. Preciso ajustar para os nós aceitarem qualquer tipo de dados, e ainda não tenho certeza se essa fila deve remover só o primeiro item da fila.

Nos próximos dias irei refinar esse código, utilizar a bateria de testes e o arquivo .h disponibilizado pelo professor.

Segue o código feito no dia de hoje (preciso versionar isso):

#include <iostream>

struct Node {
    int value; // por enquanto só aceita inteiros
    Node* next;
    Node* prev;
};

struct CircularDoublyLinkedList {
    Node* head;
    Node* tail;
    int size;

    void Enqueue(int value);
    int Dequeue();
    void Display();
};

void CircularDoublyLinkedList::Enqueue(int value) {
    Node* newNode = new Node{ value, nullptr, nullptr };

    if (size == 0) {
        head = newNode;
        tail = newNode;
        newNode->next = newNode; // é usado "->" para acessar os campos ao invés de "." quando o valor for um ponteiro.
        newNode->prev = newNode;
    } else {
        newNode->prev = tail;
        newNode->next = head;
        tail->next = newNode;
        head->prev = newNode;
        tail = newNode;
    }
    size++;
}

int CircularDoublyLinkedList::Dequeue() { // por enquanto só remove valores do início da queue
    if (size == 0) {
        std::cout << "A fila está vazia\n";
        return 0;
    }

    int value = head->value;
    Node* removedValue = head;

    if (size == 1) {
        head = nullptr;
        tail = nullptr;
    } else {
        head = head->next;
        head->prev = tail;
        tail->next = head;
    }
    size--;

    delete removedValue;
    return value;

}


void CircularDoublyLinkedList::Display() {
    if (size == 0) {
        std::cout << "A fila está vazia\n";
        return;
 }
    Node* current = head;
    for (int i = 0; i < size; i++) {
        std::cout << current->value << " ";
        current = current->next;
    }
    std::cout << std::endl;
}


int main() {
    CircularDoublyLinkedList list;  
    list.head = nullptr;            
    list.tail = nullptr;            
    list.size = 0;                   

    list.Enqueue(10);
    list.Enqueue(20);
    list.Enqueue(30);

    std::cout << "Valores na fila após Enqueue: ";
    list.Display();

    int removedValue = list.Dequeue();
    std::cout << "Valor removido: " << removedValue << std::endl;

    std::cout << "Valores na fila após Dequeue: ";
    list.Display();

    removedValue = list.Dequeue();
    std::cout << "Valor removido: " << removedValue << std::endl;

    std::cout << "Valores na fila após Dequeue: ";
    list.Display();

    removedValue = list.Dequeue();
    std::cout << "Valor removido: " << removedValue << std::endl;

    removedValue = list.Dequeue();

    return 0;
}

A struct Node representa um nó na lista com next (próximo nó) e prev (nó anterior). CircularDoublyLinkedList representa a fila circular, os ponteiros head e tail são referentes ao primeiro e último nó da fila. size representa o número de elementos.

O método Enqueue e Dequeue adicionam e removem nós. E Display lista os nós da fila.


This content originally appeared on DEV Community and was authored by Matheus Gomes ?‍?


Print Share Comment Cite Upload Translate Updates
APA

Matheus Gomes ?‍? | Sciencx (2024-10-08T02:22:15+00:00) Dia 9 – Primeira versão da fila circular duplamente encadeada. Retrieved from https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/

MLA
" » Dia 9 – Primeira versão da fila circular duplamente encadeada." Matheus Gomes ?‍? | Sciencx - Tuesday October 8, 2024, https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/
HARVARD
Matheus Gomes ?‍? | Sciencx Tuesday October 8, 2024 » Dia 9 – Primeira versão da fila circular duplamente encadeada., viewed ,<https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/>
VANCOUVER
Matheus Gomes ?‍? | Sciencx - » Dia 9 – Primeira versão da fila circular duplamente encadeada. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/
CHICAGO
" » Dia 9 – Primeira versão da fila circular duplamente encadeada." Matheus Gomes ?‍? | Sciencx - Accessed . https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/
IEEE
" » Dia 9 – Primeira versão da fila circular duplamente encadeada." Matheus Gomes ?‍? | Sciencx [Online]. Available: https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/. [Accessed: ]
rf:citation
» Dia 9 – Primeira versão da fila circular duplamente encadeada | Matheus Gomes ?‍? | Sciencx | https://www.scien.cx/2024/10/08/dia-9-primeira-versao-da-fila-circular-duplamente-encadeada/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.