Ciao a tutti!
sto cercando di implementare in c un dizionario mediante una tavola hash con liste collegate, ma i metodi insert e delete per inserire e cancellare un nodo nella lista mi danno qualche problema....la insert mi sovrascrive sempre il primo elemento puntato dalla lista, nonostante io penso di aver giustamente incrementato il puntatore, mentre la delete in realtà non mi cancella il nodo, la print continua a stampare il nodo anche quando la lista dovrebbe risultare vuota.
Mi potete aiutare a vedere dov'è il problema?..vi posto il codice...
sbaglio sicuramente qualcosa nel gestire i puntatori e la free.
Spero in una vostra risposta, grazie!!!
codice:
#include <stdio.h>
#include <stdlib.h>
#define M 10
#define DIM_ELEM 20
struct nodo {
int key;
char* val;
struct nodo* next;
} typedef nodo;
struct hashMap{
nodo* lista[M];
}typedef hashmap;
typedef int (*HashFunz)(int k);//puntatore a funzione
int hash1(int k);
int hash2(int k);
void insert(hashmap* h, char* e, int k, HashFunz hf);
void delete(hashmap* h, int k, HashFunz hf);
char* search(hashmap* h, int k, HashFunz hf);
void print(hashmap* h);
int menu();
int main(){
hashmap tavola={NULL};
int metodo;
HashFunz funzHash;
printf("Funzione hash da utilizzare per implementare la tavola:\n");
printf("1)Metodo delle divisioni\n");
printf("2)Metodo del ripiegamento(con chiavi aventi più di una cifra)\n");
scanf("%d",&metodo);
switch(metodo){
case 1:
funzHash=hash1;
break;
case 2:
funzHash=hash2;
break;
default:
printf("Valore inserito non valido. Il programma verrà terminato\n");
return 0;
}
int chiave;
while(1){
int scelta= menu();
char* elemento = (char*)malloc(DIM_ELEM * sizeof (char));
switch (scelta){
case 1:
printf("Inserisci chiave:\n");
scanf("%d", &chiave);
printf("Inserisci elemento:\n");
scanf("%s", elemento);
insert(&tavola,elemento,chiave,funzHash);
break;
case 2:
printf("Cerca chiave:\n");
scanf("%d", &chiave);
elemento=search(&tavola,chiave,funzHash);
if(elemento==NULL)
printf("Chiave non trovata.\n");
else
printf("Elemento trovato: %s\n", elemento);
break;
case 3:
printf("Cancella chiave:\n");
scanf("%d", &chiave);
delete(&tavola,chiave,funzHash);
break;
case 4:
print(&tavola);
break;
default:
return 0;
}
}
return 0;
}
int hash1(int k){
return k%M;
}
int hash2(int k){
int r=0,q=k;
k=0;
while(q>0){
r=q%10;
q=q/10;
k+=r;
}
return k%M;//Inserisco il modulo perchè la somma delle cifre potrebbe essere superiore ad m
}
void insert(hashmap* h, char* e, int k, HashFunz hf){
int indice= (*hf)(k);
nodo* nuovo=(nodo*)malloc(sizeof(nodo));
nuovo->key=k;
nuovo->val=e;
nuovo->next=NULL;
nodo* temp=h->lista[indice];
if(temp!=NULL){
while(temp->next!=NULL){
temp=temp->next;
}
temp->next=nuovo;
}
h->lista[indice]= nuovo;
if(h->lista[indice]!=NULL){
printf("Valore h->lista[indice]->key %d\n", h->lista[indice]->key);
printf("Valore h->lista[indice]->val %s\n", h->lista[indice]->val);
}else{
printf("lista ancora vuota\n");
}
printf("Voce inserita nel dizionario.\n");
return;
}
void delete(hashmap* h, int k, HashFunz hf){
int indice= (*hf)(k);
nodo* temp=h->lista[indice];
while(temp!=NULL){
if(temp->key==k){
nodo* n=temp->next;
free(temp);
temp=n;
printf("Voce cancellata dal dizionario.\n");
return;
}else{
temp=temp->next;
}
}
printf("Chiave non presente.\n");
return;
}
char* search(hashmap* h, int k, HashFunz hf){
int indice= (*hf)(k);
nodo* temp=h->lista[indice];
while(temp!=NULL){
if(temp->key==k){
return temp->val;
}else{
temp=temp->next;
}
}
return NULL;
}
void print(hashmap* h){
printf("\n\n********************************\n");
printf("Voci dizionario:\n");
printf("Indice\t\tChiave\t\tElemento\n");
int i;
nodo* temp;
for(i=0;i<M;i++){
temp=h->lista[i];
while(temp!=NULL){
printf("%d\t\t%d\t\t%s\n",i,temp->key,temp->val);
temp=temp->next;
}
}
printf("\n********************************\n\n");
return;
}
int menu(){
int scelta;
printf("\nMENU' DIZIONARIO");
printf("\n1) Aggiungi voce (con chiavi distinte)");
printf("\n2) Cerca chiave");
printf("\n3) Elimina chiave");
printf("\n4) Visualizza dizionario");
printf("\n5) Esci");
printf("\nScelta: ");
scanf("%d", &scelta);
return scelta;
}