Coder Social home page Coder Social logo

data_structures's Introduction

Estruturas de Dados em C

1 - Pilhas

  • Seguem o princípio LIFO (Last In First Out)
  • Inserções (push) e deleções (pop) ocorrem no final da pilha
typedef struct {
    int it[10];   // A pilha em si
    int max_size; // Tamanho máximo da pilha
    int top;      // Índice do último elemento dentro da pilha
} Stack;

void push(Stack* stack, int value); // Empilha um elemento
int pop(Stack* stack, int value);   // Desempilha um elemento e retorna o elemento desempilhado
void empty(Stack* stack);           // Esvazia a pilha (top == -1)
bool is_empty(Stack* stack);        // Retorna true se a pilha estiver vazia e false se não
Stack* new_Stack();                 // Retorna um ponteiro para uma pilha

2 - Filas

  • Seguem o princípio FIFO (First In First Out)
  • Inserções (enqueue) ocorrem no final da fila e deleções (dequeue) ocorrem no início da fila
  • Filas com vetor possuem caráter circular, ou seja para determinar onde se insere um item se usa aritmética modular: tail = tail % max_size + 1;
  • Para que a fórmula acima funcione, é preciso que o primeiro índice seja o 1
typedef struct {
    int it[10];   // A fila em si
    int max_size; // Tamanho máximo da fila
    int head;     // Início da fila
    int tail;     // Final da fila
} Queue;

Queue* new_Queue();                        // Retorna um ponteiro para a fila
bool qis_empty(Queue* queue);              // Retorna true se a fila estiver vazia e false se não
void enqueue(Queue* queue, int value);     // Adiciona um elemento no final da fila
int dequeue(Queue* queue);                 // Remove um elemento no início da fila
void print_queue(Queue* queue);            // Mostra os elementos da fila

3 - Listas encadeadas

  • Armazena elementos de forma não contígua
  • Lista composta de nós, cada nó armazena um valor e um ponteiro para o próximo nó na lista
  • Pode se inserir elementos onde desejar, porém inserções no início possuem complexidade O(1) e inserções no final possuem complexidade O(n)
typedef struct {
    Node* prev;
    Node* current;
} SearchContent;

typedef struct __node {
    int data;              // valor
    struct __node* next;   // ponteiro para o próximo nó na lista
} Node;

typedef struct {
    Node* head;           // primeiro nó na lista (não está vazio)
} LinkedList;


LinkedList* new_List();                            // Retorna um ponteiro para uma lista
void print_list(LinkedList* list);                 // Mostra a lista
void push_front(LinkedList* list, int value);      // Adiciona um elemento no início da lista
void push_back(LinkedList* list, int value);       // Adiciona um elemento no final da lista
void insert_in_order(LinkedList* list, int value); // Adiciona um elemento na posição correta numa lista ordenada de forma crescente
SearchContent* search(LinkedList* list, int value); // Pesquisa por um item em uma lista encadeada ordenada
void invert(LinkedList* list);                      // Inverte uma lista encadeada 
void empty_list(LinkedList* list);                  // Esvazia uma lista encadeada

4 - Lista duplamente encadeada

  • Similar às listas encadeadas
  • Porém, cada nó tem a referência para o nó seguinte e para o nó anterior
  • O nó cabeça (head) é usado como nó auxiliar, ele não armazena valor
  • A referência seguinte do ultímo nó é o nó cabeça
  • A referência anterior do nó cabeça é o último nó
  • Uma lista vazia possui apenas o nó cabeça, com a referência anterior e seguinte sendo o próprio nó cabeça
typedef struct __double_node {
    int data;
    struct __double_node* prev;
    struct __double_node* next;
} DoubleNode;

typedef struct {
    DoubleNode* head;
} DoublyLinkedList;

DoublyLinkedList* new_DoublyLinkedList(); // Retorna um ponteiro para uma lista duplamente encadeada
DoubleNode* search_in(DoublyLinkedList* list, int value); // Pesquisa um valor em uma lista duplamente encadeada ordenada
void insert_in_order_in(DoublyLinkedList* list, int value); // Insere um valor de forma ordenada em uma lista duplamente encadeada ordenada
void remove_from(DoublyLinkedList* list, int value); // Remove um valor da lista duplamente encadeada
void print_doubly_linked_list(DoublyLinkedList* list); // Mostra o conteúdo da lista duplamente encadeada

data_structures's People

Contributors

gddeazevedo avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.