Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///EJERCICIO 2
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned (*FuncionHash)(void* clave);
- typedef int (*FuncionIgualdad)(void *, void *);
- typedef struct {
- void* clave;
- void* dato;
- } CasillaHash;
- typedef struct {
- CasillaHash* tabla;
- unsigned numElems;
- unsigned capacidad;
- FuncionHash hash;
- FuncionIgualdad igualdad;
- } TablaHash;
- TablaHash* tablahash_crear(unsigned capacidad, FuncionHash hash, FuncionIgualdad igualdad) {
- // Pedimos memoria para la estructura principal y las casillas.
- TablaHash* tabla = malloc(sizeof(TablaHash));
- tabla->hash = hash;
- tabla->capacidad = capacidad;
- tabla->igualdad = igualdad;
- tabla->tabla = malloc(sizeof(CasillaHash) * capacidad);
- tabla->numElems = 0;
- // Inicializamos las casillas con datos nulos.
- for (unsigned idx = 0; idx < capacidad; ++idx) {
- tabla->tabla[idx].clave = NULL;
- tabla->tabla[idx].dato = NULL;
- }
- return tabla;
- }
- void tablahash_insertar(TablaHash* tabla, void* clave, void* dato) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- // Si el lugar estaba vacío, incrementamos el número de elementos.
- if (tabla->tabla[idx].dato == NULL)
- tabla->numElems++;
- // Almacenamos los datos ingresados.
- tabla->tabla[idx].clave = clave;
- tabla->tabla[idx].dato = dato;
- }
- void* tablahash_buscar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- // Si el lugar esta vacío, retornamos un puntero nulo.
- if ( !tabla->igualdad(tabla->tabla[idx].clave,clave) )
- return NULL;
- return tabla->tabla[idx].dato;
- }
- void tablahash_eliminar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- // Si el lugar estaba ocupado, decrementamos el número de elementos.
- if (tabla->tabla[idx].clave != NULL)
- tabla->numElems--;
- // Vaciamos la casilla.
- tabla->tabla[idx].clave = NULL;
- tabla->tabla[idx].dato = NULL;
- }
- void tablahash_destruir(TablaHash* tabla) {
- free(tabla->tabla);
- free(tabla);
- }
- unsigned hash(void* clave) {
- int* p = clave;
- return *p;
- }
- int iguales(void* p1, void* p2){
- int *pi1 = p1, *pi2 = p2;
- return *pi1 == *pi2;
- }
- int main(void) {
- int x = 42, y = 42, z = 3;
- TablaHash *th = tablahash_crear(10, hash, iguales);
- tablahash_insertar(th, &x, &z);
- printf("z : %d\n", *((int *)tablahash_buscar(th, &x)));
- printf("z : %d\n", *((int *)tablahash_buscar(th, &y)));
- tablahash_eliminar(th, &x);
- tablahash_destruir(th);
- return 0;
- }
- ///EJERCICIO 3
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned (*FuncionHash)(void* clave);
- typedef int (*FuncionIgualdad)(void *, void *);
- typedef struct {
- void* clave;
- void* dato;
- } CasillaHash;
- typedef struct {
- CasillaHash* tabla;
- unsigned numElems;
- unsigned capacidad;
- FuncionHash hash;
- FuncionIgualdad igualdad;
- } TablaHash;
- TablaHash* tablahash_crear(unsigned capacidad, FuncionHash hash, FuncionIgualdad igualdad) {
- // Pedimos memoria para la estructura principal y las casillas.
- TablaHash* tabla = malloc(sizeof(TablaHash));
- tabla->hash = hash;
- tabla->capacidad = capacidad;
- tabla->igualdad = igualdad;
- tabla->tabla = malloc(sizeof(CasillaHash) * capacidad);
- tabla->numElems = 0;
- // Inicializamos las casillas con datos nulos.
- for (unsigned idx = 0; idx < capacidad; ++idx) {
- tabla->tabla[idx].clave = NULL;
- tabla->tabla[idx].dato = NULL;
- }
- return tabla;
- }
- void tablahash_insertar(TablaHash* tabla, void* clave, void* dato) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i = 0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i)%tabla->capacidad;
- if(tabla->tabla[aux].dato == NULL){
- tabla->numElems++;
- tabla->tabla[aux].clave = clave;
- tabla->tabla[aux].dato = dato;
- break;
- }
- }
- }
- void* tablahash_buscar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i)%tabla->capacidad;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave))
- return tabla->tabla[aux].dato;
- }
- return NULL;
- }
- ///Si encontramos algo a eliminar, dejamos la clave y ponemos el dato en NULL.
- void tablahash_eliminar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i)%tabla->capacidad;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave)) {
- tabla->numElems--;
- tabla->tabla[aux].dato = NULL;
- break;
- }
- }
- }
- void tablahash_destruir(TablaHash* tabla) {
- free(tabla->tabla);
- free(tabla);
- }
- unsigned hash(void* clave) {
- int* p = clave;
- return *p;
- }
- int iguales(void* p1, void* p2){
- int *pi1 = p1, *pi2 = p2;
- return *pi1 == *pi2;
- }
- int main(void) {
- int x = 42, y = 42, z = 3;
- TablaHash *th = tablahash_crear(10, hash, iguales);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre antes de agregar. Todo bien.\n") : printf("ERROR.\n");
- tablahash_insertar(th, &x, &z);
- tablahash_insertar(th, &x, &z);
- tablahash_eliminar(th, &x);
- printf("z : %d\n", *((int *)tablahash_buscar(th, &x)));
- tablahash_eliminar(th, &x);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre. Todo bien.\n") : printf("ERROR.\n");
- tablahash_destruir(th);
- return 0;
- }
- ///EJERCICIO 4
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned (*FuncionHash)(void* clave);
- typedef unsigned (*FuncionHash2)(void* clave, unsigned m);
- typedef int (*FuncionIgualdad)(void *, void *);
- typedef struct {
- void* clave;
- void* dato;
- } CasillaHash;
- typedef struct {
- CasillaHash* tabla;
- unsigned numElems;
- unsigned capacidad;
- FuncionHash hash;
- FuncionHash2 hash2;
- FuncionIgualdad igualdad;
- } TablaHash;
- TablaHash* tablahash_crear(unsigned capacidad, FuncionHash hash, FuncionHash2 hash2, FuncionIgualdad igualdad) {
- // Pedimos memoria para la estructura principal y las casillas.
- TablaHash* tabla = malloc(sizeof(TablaHash));
- tabla->hash = hash;
- tabla->hash2 = hash2;
- tabla->capacidad = capacidad;
- tabla->igualdad = igualdad;
- tabla->tabla = malloc(sizeof(CasillaHash) * capacidad);
- tabla->numElems = 0;
- // Inicializamos las casillas con datos nulos.
- for (unsigned idx = 0; idx < capacidad; ++idx) {
- tabla->tabla[idx].clave = NULL;
- tabla->tabla[idx].dato = NULL;
- }
- return tabla;
- }
- void tablahash_insertar(TablaHash* tabla, void* clave, void* dato) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i = 0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].dato == NULL){
- tabla->numElems++;
- tabla->tabla[aux].clave = clave;
- tabla->tabla[aux].dato = dato;
- break;
- }
- }
- }
- void* tablahash_buscar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave))
- return tabla->tabla[aux].dato;
- }
- return NULL;
- }
- ///Si encontramos algo a eliminar, dejamos la clave y ponemos el dato en NULL.
- void tablahash_eliminar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave)) {
- tabla->numElems--;
- tabla->tabla[aux].dato = NULL;
- break;
- }
- }
- }
- void tablahash_destruir(TablaHash* tabla) {
- free(tabla->tabla);
- free(tabla);
- }
- unsigned hash(void* clave) {
- int* p = clave;
- return *p;
- }
- unsigned hash2(void* clave, unsigned m) {
- int *p = clave;
- return 1 + *p % (m - 1);
- }
- int iguales(void* p1, void* p2){
- int *pi1 = p1, *pi2 = p2;
- return *pi1 == *pi2;
- }
- int main(void) {
- int x = 42, y = 42, z = 3;
- TablaHash *th = tablahash_crear(10, hash, hash2, iguales);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre antes de agregar. Todo bien.\n") : printf("ERROR.\n");
- tablahash_insertar(th, &x, &z);
- tablahash_insertar(th, &x, &z);
- tablahash_eliminar(th, &x);
- printf("z : %d\n", *((int *)tablahash_buscar(th, &x)));
- tablahash_eliminar(th, &x);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre. Todo bien.\n") : printf("ERROR.\n");
- tablahash_destruir(th);
- return 0;
- }
- ///EJERCICIO 5
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned (*FuncionHash)(void* clave);
- typedef unsigned (*FuncionHash2)(void* clave, unsigned m);
- typedef int (*FuncionIgualdad)(void *, void *);
- typedef struct {
- void* clave;
- void* dato;
- } CasillaHash;
- typedef struct {
- CasillaHash* tabla;
- unsigned numElems;
- unsigned capacidad;
- FuncionHash hash;
- FuncionHash2 hash2;
- FuncionIgualdad igualdad;
- } TablaHash;
- TablaHash* tablahash_crear(unsigned capacidad, FuncionHash hash, FuncionHash2 hash2, FuncionIgualdad igualdad) {
- // Pedimos memoria para la estructura principal y las casillas.
- TablaHash* tabla = malloc(sizeof(TablaHash));
- tabla->hash = hash;
- tabla->hash2 = hash2;
- tabla->capacidad = capacidad;
- tabla->igualdad = igualdad;
- tabla->tabla = malloc(sizeof(CasillaHash) * capacidad);
- tabla->numElems = 0;
- // Inicializamos las casillas con datos nulos.
- for (unsigned idx = 0; idx < capacidad; ++idx) {
- tabla->tabla[idx].clave = NULL;
- tabla->tabla[idx].dato = NULL;
- }
- return tabla;
- }
- void tablahash_insertar(TablaHash* tabla, void* clave, void* dato) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i = 0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].dato == NULL){
- tabla->numElems++;
- tabla->tabla[aux].clave = clave;
- tabla->tabla[aux].dato = dato;
- break;
- }
- }
- }
- void* tablahash_buscar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux, posicionAux, flag = 0;
- void* punteroSwap;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if (tabla -> tabla[aux].dato == NULL && flag == 0){
- flag++; posicionAux = aux;
- }
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave)) {
- if(flag){
- punteroSwap = tabla -> tabla[posicionAux].dato;
- tabla -> tabla[posicionAux].dato = tabla -> tabla[aux].dato;
- tabla -> tabla[aux].dato = punteroSwap;
- punteroSwap = tabla -> tabla[posicionAux].clave;
- tabla -> tabla[posicionAux].clave = tabla -> tabla[aux].clave;
- tabla -> tabla[aux].clave = punteroSwap;
- return tabla->tabla[posicionAux].dato;
- }
- return tabla->tabla[aux].dato;
- }
- }
- return NULL;
- }
- ///Si encontramos algo a eliminar, dejamos la clave y ponemos el dato en NULL.
- void tablahash_eliminar(TablaHash* tabla, void* clave) {
- // Calculamos la posición de la clave dada, de acuerdo a la función hash.
- unsigned idx = tabla->hash(clave);
- idx = idx % tabla->capacidad;
- int i=0, aux;
- for(i = 0; i < tabla -> capacidad; i++){
- aux = (idx + i * tabla->hash2(clave, tabla->capacidad)) % tabla->capacidad ;
- if(tabla->tabla[aux].clave == NULL)
- break;
- if(tabla->tabla[aux].dato != NULL && tabla->igualdad(tabla->tabla[aux].clave,clave)) {
- tabla->numElems--;
- tabla->tabla[aux].dato = NULL;
- break;
- }
- }
- }
- void tablahash_destruir(TablaHash* tabla) {
- free(tabla->tabla);
- free(tabla);
- }
- unsigned hash(void* clave) {
- int* p = clave;
- return *p;
- }
- unsigned hash2(void* clave, unsigned m) {
- int *p = clave;
- return 1 + *p % (m - 1);
- }
- int iguales(void* p1, void* p2){
- int *pi1 = p1, *pi2 = p2;
- return *pi1 == *pi2;
- }
- int main(void) {
- int x = 42, y = 42, z = 3;
- TablaHash *th = tablahash_crear(10, hash, hash2, iguales);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre antes de agregar. Todo bien.\n") : printf("ERROR.\n");
- tablahash_insertar(th, &x, &z);
- tablahash_insertar(th, &x, &z);
- tablahash_eliminar(th, &x);
- printf("z : %d\n", *((int *)tablahash_buscar(th, &x)));
- tablahash_eliminar(th, &x);
- (tablahash_buscar(th, &x) == NULL) ? printf("No lo encontre. Todo bien.\n") : printf("ERROR.\n");
- tablahash_destruir(th);
- return 0;
- }
- ///EJERCICIO 6
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned (*FuncionHash)(void* clave);
- typedef int (*FuncionIgualdad)(void *, void *);
- typedef struct _DatoHash{
- void* clave;
- void* dato;
- struct _DatoHash* sig;
- } *DatoHash;
- typedef struct {
- DatoHash* tabla;
- unsigned numElems;
- unsigned capacidad;
- FuncionHash hash;
- FuncionIgualdad igualdad;
- } TablaHash;
- TablaHash* tablahash_crear(unsigned capacidad, FuncionHash hash, FuncionIgualdad igualdad) {
- TablaHash* NuevaTabla = malloc(sizeof(TablaHash));
- NuevaTabla -> tabla = malloc(sizeof(DatoHash) * capacidad);
- NuevaTabla -> numElems = 0;
- NuevaTabla -> capacidad = capacidad;
- NuevaTabla -> hash = hash;
- NuevaTabla -> igualdad = igualdad;
- for(int i = 0; i < capacidad; i++)
- NuevaTabla -> tabla[i] = NULL;
- return NuevaTabla;
- }
- void tablahash_insertar(TablaHash* tabla, void* clave, void* dato) {
- tabla -> numElems ++;
- DatoHash nuevaCelda = malloc(sizeof(struct _DatoHash));
- nuevaCelda -> clave = clave;
- nuevaCelda -> dato = dato;
- nuevaCelda -> sig = NULL;
- unsigned idx = tabla -> hash(clave) % tabla -> capacidad;
- if(tabla -> tabla[idx] == NULL)
- tabla -> tabla[idx] = nuevaCelda;
- else{
- DatoHash punteroAux = tabla -> tabla[idx];
- for(; punteroAux -> sig != NULL; punteroAux = punteroAux -> sig);
- punteroAux -> sig = nuevaCelda;
- }
- }
- void* tablahash_buscar(TablaHash* tabla, void* clave) {
- unsigned idx = tabla -> hash(clave) % tabla -> capacidad;
- if(tabla -> tabla[idx] == NULL)
- return NULL;
- DatoHash punteroAux = tabla -> tabla[idx];
- for(; punteroAux != NULL && !tabla->igualdad(clave, punteroAux -> clave); punteroAux = punteroAux -> sig);
- return (punteroAux == NULL)? NULL : punteroAux ->dato;
- }
- void tablahash_eliminar(TablaHash* tabla, void* clave){
- unsigned idx = tabla -> hash(clave) % tabla -> capacidad;
- if(tabla -> tabla[idx] != NULL){
- if(tabla-> igualdad(tabla -> tabla[idx] -> clave, clave) ){
- DatoHash punteroAux = tabla -> tabla[idx];
- tabla -> tabla[idx] = tabla -> tabla[idx] -> sig;
- free(punteroAux);
- tabla -> numElems --;
- }
- DatoHash punteroAux = tabla -> tabla[idx] -> sig, punteroAnterior = tabla ->tabla[idx];
- for(; punteroAux -> sig != NULL && !tabla -> igualdad(punteroAux -> clave, clave); punteroAux = punteroAux -> sig, punteroAnterior = punteroAnterior -> sig);
- if(tabla -> igualdad(punteroAux -> clave, clave)){
- punteroAnterior -> sig = punteroAux -> sig;
- free(punteroAux);
- tabla -> numElems --;
- }
- }
- }
- void tablahash_destruir(TablaHash* tabla) {
- DatoHash punteroAux, punteroAux2;
- for(int i = 0; i < tabla -> capacidad; i++)
- for(punteroAux = punteroAux2 = tabla -> tabla[i]; punteroAux != NULL; punteroAux2 = punteroAux){
- punteroAux = punteroAux -> sig;
- free(punteroAux2);
- }
- free(tabla->tabla);
- free(tabla);
- }
- unsigned hash(void* clave) {
- int* p = clave;
- return *p;
- }
- int iguales(void* p1, void* p2){
- int *pi1 = p1, *pi2 = p2;
- return *pi1 == *pi2;
- }
- int main() {
- int a = 42, b = 2, c = 7;
- TablaHash* tabla = tablahash_crear(10, hash, iguales);
- (tablahash_buscar(tabla, &a) == NULL)? printf("No encuentra nada, todo bien.\n") : printf("OhNo.mp3\n");
- tablahash_insertar(tabla, &a, &a);
- (tablahash_buscar(tabla, &b) == NULL)? printf("No encuentra nada, todo bien.\n") : printf("OhNo.mp3\n");
- tablahash_insertar(tabla, &b, &b);
- tablahash_insertar(tabla, &c, &c);
- (tablahash_buscar(tabla, &b) != NULL)? printf("Encuentra algo, todo bien.\n") : printf("OhNo.mp3\n");
- tablahash_eliminar(tabla, &b);
- (tablahash_buscar(tabla, &b) == NULL)? printf("No encuentra nada, todo bien.\n") : printf("OhNo.mp3\n");
- tablahash_destruir(tabla);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement