Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //----------------------------------------------------------------------------------------
- //Cria um node que guarda os valores que são enfileirados no deque
- node_t* node_new (int value){
- node_t* new_node = (node_t*) malloc(sizeof(node_t));
- new_node->value = value;
- return new_node;
- }
- //Cria um deque dinamicamente e retorna seu endereço de memoria
- deque_t* construct (){
- deque_t* new_deque = (deque_t*) malloc(sizeof(deque_t));
- new_deque->front = NULL;
- new_deque->rear = NULL;
- new_deque->size = 0;
- return new_deque;
- }
- //Libera a memória do conteúdo e do próprio deque
- void destruct (deque_t *deque){
- erase(deque);
- free(deque);
- }
- //Retorna o tamanho do deque
- int size (deque_t *deque){
- return deque->size;
- }
- //Retorna verdadeiro se o deque esta vazio, caso contrário, retorna falso
- bool empty (deque_t *deque){
- return (deque->size == 0);
- }
- //Retorna o valor da frente da lista, retorna int_min quando a lista estiver vazia
- int front (deque_t *deque){
- if (empty(deque)) return INT_MIN;
- return deque->front->value;
- }
- //Retorna o valor do fim da lista, retorna int_min quando a lista estiver vazia
- int rear (deque_t *deque){
- if (empty(deque)) return INT_MIN;
- return deque->rear->value;
- }
- //Cria um nó que guarda um valor e o adiciona ao fim do deque
- void enqueue_rear (deque_t *deque, int value){
- node_t* new_node = node_new(value);
- new_node->next = NULL;
- new_node->prev = deque->rear;
- if(deque->rear != NULL) deque->rear->next = new_node;
- deque->rear = new_node;
- if(deque->front == NULL) deque->front = new_node;
- deque->size++;
- }
- //Cria um nó que guarda um valor e o adiciona ao inicio do deque
- void enqueue_front(deque_t *deque, int value){
- node_t* new_node = node_new(value);
- new_node->next = deque->front;
- new_node->prev = NULL;
- if(deque->front != NULL) deque->front->prev = new_node;
- deque->front = new_node;
- if(deque->rear == NULL) deque->rear = new_node;
- deque->size++;
- }
- //Retira o valor do final caso não esteja vazia
- void dequeue_rear (deque_t *deque){
- if (empty(deque)) return;
- node_t* temp = deque->rear;
- if(deque->rear->prev != NULL) deque->rear->prev->next = NULL;
- deque->rear = deque->rear->prev;
- free(temp);
- deque->size--;
- }
- //Retira o valor da frente caso não esteja vazia
- void dequeue_front(deque_t *deque){
- if (empty(deque)) return;
- node_t* temp = deque->front;
- if(deque->front->next != NULL) deque->front->next->prev = NULL;
- deque->front = deque->front->next;
- free(temp);
- deque->size--;
- }
- //Limpa o conteudo do deque(deixa ele vazio)
- void erase (deque_t *deque){
- node_t* temp = deque->front;
- while (temp != NULL){
- //printf("Deleting node [%d]\t-\t", temp->value);
- dequeue_front(deque);
- //printf("Node deleted, %d nodes left.\n", deque->size);
- temp = deque->front;
- }
- }
- //Imprime o deque em uma unica linha, com os elementos separados por um espaço,
- //terminando com um \n, lembrando de respeitar os conceitos de fila.
- void print (deque_t *deque){
- node_t* temp = deque->front;
- while (temp != NULL){
- printf("%d", temp->value);
- if (temp->next != NULL) printf(" ");
- temp= temp->next;
- }
- printf("\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement