-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtablas.c
111 lines (94 loc) · 2.99 KB
/
tablas.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
// Creado por Pablo P. Pablo M. Maite G.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <math.h>
#include "tablas.h"
unsigned int dispersionA(char *clave, int tamTabla) {
int i, n = MIN(8, strlen(clave)));
unsigned int valor = clave[0];
for (i = 1; i < n; i++) {
valor += clave[i];
}
return valor % tamTabla;
}
unsigned int dispersionB(char *clave, int tamTabla) {
int i, n = MIN(8, strlen(clave)));
unsigned int valor = clave[0];
for (i = 1; i < n; i++) {
valor = (valor << 5) + clave[i];
}
return valor % tamTabla;
}
unsigned int ndispersion(char *clave, int tamTabla) {
if (strcmp(clave, "ANA") == 0) return 7;
if (strcmp(clave, "JOSE") == 0) return 7;
if (strcmp(clave, "OLGA") == 0) return 7;
return 6;
}
void inicializar_cerrada(tabla_cerrada *diccionario, int tam) {
int i = 0;
// Se recorre toda la "tabla" marcando cada elemento como no ocupado
for (i = 0; i < tam; i++) {
(*diccionario)[i].ocupada = 0;
}
}
pos buscar_cerrada(char *clave, tabla_cerrada diccionario, int tam, int *colisiones,
unsigned int (*dispersion)(char *, int),
unsigned int (*resol_colisiones)(int pos_ini, int num_intento)) {
int i = 0;
int x = dispersion(clave, tam);
int posAct = x;
while (diccionario[posAct].ocupada &&
strcmp(diccionario[posAct].clave, clave)) {
i++;
posAct = resol_colisiones(x, i) % tam;
}
*colisiones = i;
return posAct;
}
int insertar_cerrada(char *clave, char *sinonimos, tabla_cerrada *diccionario, int tam,
unsigned int (*dispersion)(char *, int),
unsigned int (*resol_colisiones)(int pos_ini, int num_intento)) {
int i = 0;
int posAct;
posAct = buscar_cerrada(clave, *diccionario, tam, &i, dispersion, resol_colisiones);
if (!((*diccionario)[posAct].ocupada)) {
strcpy((*diccionario)[posAct].clave, clave);
strcpy((*diccionario)[posAct].sinonimos, sinonimos);
(*diccionario)[posAct].ocupada = 1;
}
return i;
}
void mostrar_cerrada(tabla_cerrada diccionario, int tam) {
int i = 0;
for (i = 0; i < tam; i++) {
printf("%2d - ", i);
if (diccionario[i].ocupada)
printf("(%s)", diccionario[i].clave);
printf("\n");
}
}
unsigned int explora_lineal(int pos_ini, int num_intentos) {
int posAct;
posAct = pos_ini + num_intentos;
return posAct;
}
unsigned int explora_cuadratica(int pos_ini, int num_intentos) {
int posAct;
posAct = pos_ini + powf(num_intentos, 2);
return posAct;
}
unsigned int explora_doble(int pos_ini, int num_intentos) {
int posAct;
posAct = pos_ini + (10007 - pos_ini % 10007) * num_intentos;
return posAct;
}
unsigned int explora_doble_test_only(int pos_ini, int num_intentos) {
int posAct;
posAct = pos_ini + (5 - pos_ini % 5) * num_intentos;
return posAct;
}