Advertisement
Guest User

Código redimensionar y guardar

a guest
Oct 14th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.60 KB | None | 0 0
  1. bool hash_redimensionar(hash_t *hash, size_t tam){
  2.     campo_t* campos_nuevo = malloc(tam * sizeof(campo_t));
  3.     if (!campos_nuevo) return false;
  4.     _inicializar_campos(campos_nuevo, tam);
  5.     for (int i = 0; i < hash->capacidad; i++){
  6.         if (hash->campos[i].estado == VACIO) continue;
  7.         if(hash->campos[i].estado == OCUPADO){
  8.             size_t posicion_nueva = FNV64(hash->campos[i].clave, tam);
  9.             campos_nuevo[posicion_nueva].clave = malloc((strlen(hash->campos[i].clave) + 1)* sizeof(char));
  10.             if (!campos_nuevo[posicion_nueva].clave){
  11.                 destruir_campos(campos_nuevo, hash->capacidad, hash->destruir_dato);
  12.                 return false;
  13.             }
  14.             strcpy(campos_nuevo[posicion_nueva].clave, hash->campos[i].clave);
  15.             campos_nuevo[posicion_nueva].valor = hash->campos[i].valor;
  16.             campos_nuevo[posicion_nueva].estado = OCUPADO;
  17.         }
  18.         free(hash->campos[i].clave);
  19.         if (hash->campos[i].estado == BORRADO && hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[i].valor);
  20.     }
  21.     free(hash->campos);
  22.     hash->campos = campos_nuevo;
  23.     hash->borrados = 0;
  24.     hash->capacidad = tam;
  25.     return true;
  26. }
  27.  
  28. bool hash_guardar(hash_t *hash, const char *clave, void *dato){
  29.     if ((hash->cantidad + hash->borrados) / hash->capacidad >= HASH_COEF_REDIMENSION && !hash_redimensionar(hash, hash->capacidad * HASH_MODIFICAR_CAPACIDAD)){
  30.         return false;
  31.     }
  32.     unsigned long posicion_clave = FNV64(clave, hash->capacidad);
  33.     while(hash->campos[posicion_clave].estado == OCUPADO && strcmp(hash->campos[posicion_clave].clave, clave) != 0){
  34.         posicion_clave++;
  35.         if(posicion_clave >= hash->capacidad) posicion_clave = 0;
  36.     }
  37.     switch (hash->campos[posicion_clave].estado){
  38.         case OCUPADO:  
  39.             if(hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[posicion_clave].valor);
  40.             break;
  41.         case BORRADO:
  42.             if (strcmp(hash->campos[posicion_clave].clave, clave) != 0){
  43.                 hash->campos[posicion_clave].clave = realloc(hash->campos[posicion_clave].clave, (strlen(clave) + 1) * sizeof(char));
  44.                 if(!hash->campos[posicion_clave].clave) return false;
  45.                 strcpy(hash->campos[posicion_clave].clave, clave);
  46.             }
  47.             if(hash->destruir_dato != NULL) hash->destruir_dato(hash->campos[posicion_clave].valor);
  48.             hash->borrados--;
  49.             hash->cantidad++;
  50.             hash->campos[posicion_clave].estado = OCUPADO;
  51.             break;
  52.         case VACIO:
  53.             hash->campos[posicion_clave].clave = malloc((strlen(clave) + 1)* sizeof(char));
  54.             if(!hash->campos[posicion_clave].clave) return false;
  55.             strcpy(hash->campos[posicion_clave].clave, clave);
  56.             hash->campos[posicion_clave].estado = OCUPADO;
  57.             hash->cantidad++;
  58.             break;
  59.     }
  60.     hash->campos[posicion_clave].valor = dato;
  61.     return true;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement