Utilizando arrays associativos

C:
Utilizando arrays associativos

Como fazer:

C não possui suporte embutido para arrays associativos como algumas linguagens de mais alto nível, mas você pode simulá-los usando estruturas e hashing. Abaixo está um exemplo simplista usando uma combinação de uma struct e uma função de hashing simples para implementar um array associativo para armazenar e acessar inteiros por chaves de string.

Primeiro, defina uma estrutura para representar um único par chave-valor e outra para representar o próprio array associativo:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TABLE_SIZE 128

typedef struct {
    char* chave;
    int valor;
} ParChaveValor;

typedef struct {
    ParChaveValor* itens[TABLE_SIZE];
} ArrayAssoc;

unsigned int hash(char* chave) {
    unsigned long int valor = 0;
    unsigned int i = 0;
    unsigned int comprimento_chave = strlen(chave);

    for (; i < comprimento_chave; ++i) {
        valor = valor * 37 + chave[i];
    }

    valor = valor % TABLE_SIZE;

    return valor;
}

void initArray(ArrayAssoc* array) {
    for (int i = 0; i < TABLE_SIZE; ++i) {
        array->itens[i] = NULL;
    }
}

void inserir(ArrayAssoc* array, char* chave, int valor) {
    unsigned int slot = hash(chave);

    ParChaveValor* item = (ParChaveValor*)malloc(sizeof(ParChaveValor));
    item->chave = strdup(chave);
    item->valor = valor;

    array->itens[slot] = item;
}

int encontrar(ArrayAssoc* array, char* chave) {
    unsigned int slot = hash(chave);

    if (array->itens[slot]) {
        return array->itens[slot]->valor;
    }
    return -1;
}

int main() {
    ArrayAssoc a;
    initArray(&a);

    inserir(&a, "chave1", 1);
    inserir(&a, "chave2", 2);

    printf("%d\n", encontrar(&a, "chave1")); // Saída: 1
    printf("%d\n", encontrar(&a, "chave2")); // Saída: 2

    return 0;
}

Este exemplo demonstra operações básicas: inicializando um array associativo, inserindo pares chave-valor e encontrando valores pelas chaves. Note que este código não trata colisões e é destinado a fins educacionais.

Aprofundando

O conceito de arrays associativos antecede a linguagem C, mas a natureza de baixo nível da linguagem não os suporta diretamente como tipos embutidos. Isso encoraja um entendimento mais profundo das estruturas de dados e algoritmos, incluindo mecanismos de hashing para mapeamento eficiente de chave-valor. Muitas bibliotecas e frameworks de C oferecem abordagens mais sofisticadas para implementar arrays associativos, como o GHashTable da GLib, que fornece uma implementação robusta completada com tratamento de colisões, redimensionamento dinâmico e suporte para tipos de chaves e valores arbitrários.

Embora a construção manual de arrays associativos em C possa ser vista como trabalhosa comparada a linguagens com suporte embutido, ela oferece insights inestimáveis sobre o funcionamento interno das estruturas de dados, aprimorando as habilidades de resolução de problemas e otimização dos programadores. No entanto, para códigos de produção ou aplicações mais complexas, aproveitar bibliotecas existentes como a GLib geralmente é uma abordagem mais prática e eficiente em termos de tempo.