-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhash.c
144 lines (117 loc) · 2.33 KB
/
hash.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"hash.h"
static int size; //grandezza della tabella hash
/*
Ritorna la posione di key nella tabella hash
*/
int hashCode(char* key){
int i;
int aux=0;
for(i=0; i<strlen(key); i++){
aux+=key[i];
}
return (aux%size);
}
/*
Ritorna una tabella hash di dimensione n con NULL in tutte le posizioni.
Se non va a buon fine viene ritornato NULL.
*/
hash_t* create_hash_table(int n){
int i;
hash_t* table = (hash_t*)malloc(n*sizeof(hash_t));
if(table==NULL) return NULL;
for(i=0; i<n; i++){
table[i] = NULL;
}
size=n;
return table;
}
/*
Inserisce value in table.
Ritorna 0 in caso di successo, -1 altrimenti.
*/
int insert_hash_table(hash_t *table, char* value){
int i=hashCode(value);
hash_t node=(hash_t)malloc(sizeof(node_t));
if(node==NULL) return -1;
node->next=NULL;
node->data=calloc(strlen(value)+1,sizeof(char));
if(node->data==NULL) return -1;
strncpy(node->data,value,strlen(value)+1);
if(table[i]==NULL){
table[i]=node;
}
else{
node->next=table[i];
table[i]=node;
}
return 0;
}
/*
Cerca value in table.
Ritorna 1 se l'ha trovato, 0 altrimenti.
*/
int find_hash_table(hash_t* table, char* value){
int find=0;
if(value!=NULL){
int i=hashCode(value);
hash_t aux=table[i];
while(aux!=NULL && find==0){
if(strcmp(aux->data,value)==0){
find=1;
}
else{
aux=aux->next;
}
}
}
return find;
}
/*
Rimuove value da table.
Ritorna 1 se l'operazione è andata a buon fine, 0 altrimenti
*/
int remove_hash_table(hash_t* table, char* value){
if(value!=NULL){
int i=hashCode(value);
hash_t aux=table[i];
hash_t prec=NULL;
while(aux!=NULL){
if(strcmp(aux->data,value)==0){
if(prec==NULL){
table[i]=aux->next;
}
else{
prec->next=aux->next;
}
free(aux->data);
free(aux);
return 1;
}
prec=aux;
aux=aux->next;
}
}
return 0;
}
/*
Elimina table liberando memoria
*/
void delete_hash_table(hash_t* table){
int i;
hash_t aux,succ=NULL;
for(i=0; i<size; i++){
aux=table[i];
if(aux!=NULL){
while(aux!=NULL){
succ=aux->next;
free(aux->data);
free(aux);
aux=succ;
}
}
}
free(table);
}