ok allora posto tutto il codice necessario:
dizionario.h
codice:
#ifndef dizionario_h
#define dizionario_h
#include<iostream>
#include<stdlib.h>
using namespace std;
template<class tipoelem>
class dizionario
{
public:
virtual void creadizionario() = 0;
virtual bool appartiene(char *) = 0;
virtual void inserisci(tipoelem) = 0;
virtual void cancella(char *) = 0;
virtual tipoelem recupera(char *) = 0;
virtual void aggiorna(char *, tipoelem) = 0;
void test();
};
#endif
template<class tipoelem>
void dizionario<tipoelem>::test()
{
cout << " ***test del metodo APPARTIENE***\n\n";
cout << "il metodo controlla se la chiave fornita come argomento e' presente o meno\n";
cout << "nel dizionario.\n\n";
cout << " inserimento nel dizionario dell'elemento:\n";
cout << " valore dell'elemento: ";
tipoelem elem;
cin >> elem;
this->inserisci(elem);
cout << " test con esito negativo:\n";
cout << " appartiene(totaro) = " << this->appartiene("totaro") << "\n\n";
cout << " test con esito positivo:\n";
cout << " appartiene(laforgia) = " << this->appartiene("laforgia") << "\n\n\n\n";
cout << " ***test del metodo RECUPERA***\n\n";
cout << "il metodo fornisce il valore dell'elemento con la relativa chiave che viene\n";
cout << "passato come argomento.\n\n";
cout << " recupera(laforgia) = " << this->recupera("laforgia") << "\n\n";
cout << " ***test del metodo AGGIORNA***\n\n";
cout << "il metodo cambia il valore dell'elemento con la relativa chiave passata come\n";
cout << "argomento.\n\n";
cin >> elem;
this->aggiorna("laforgia", elem);
cout << " recupera(laforgia) = " << this->recupera("laforgia") << "\n\n";
cout << " ***test del metodo CANCELLA***\n\n";
cout << "il metodo elimina dal dizionario l'elemento con la chiave fornita come argomento.\n";
this->cancella("laforgia");
cout << " recupera(laforgia) = " << this->recupera("laforgia") << "\n\n";
}
dizionariothc.h
codice:
#ifndef dizionariothc_h
#define dizionariothc_h
#include<iostream>
#include<stdlib.h>
#include<assert.h>
#include<math.h>
#include<string>
#define maxdim 101
using namespace std;
template<class tipoelem>
class dizionariothc : public dizionario<tipoelem>
{
public:
dizionariothc();
void creadizionario();
bool appartiene(char *);
void inserisci(tipoelem);
void cancella(char *);
tipoelem recupera(char *);
void aggiorna(char *, tipoelem);
private:
int h(char *key);
typedef struct bucket
{
char *chiave;
tipoelem elemento;
bool occupato;
} bucket;
bucket tavola[maxdim];
int numbucket;
};
#endif
template<class tipoelem>
int dizionariothc<tipoelem>::h(char *key)
{
int i = 0;
int result = 0;
int c = key[i];
int tmp[strlen(key)];
while(c != '\0')
{
if((c >= 48) && (c <= 57))
tmp[i] = c - 48;
else
{
if((c >= 65) && (c <= 90))
tmp[i] = c - 64;
else
{
if((c >= 97) && (c <= 122))
tmp[i] = c - 96;
}
}
i++;
c = key[i];
}
i = strlen(key);
while(i != 0)
{
result += tmp[i - 1] * (int)pow(13, (strlen(key) - i));
i--;
}
result = result % 101;
return result;
}
template<class tipoelem>
dizionariothc<tipoelem>::dizionariothc()
{
this->creadizionario();
}
template<class tipoelem>
void dizionariothc<tipoelem>::creadizionario()
{
for(int i = 0; i < maxdim; i++)
{
tavola[i].occupato = false;
}
numbucket = 0;
}
template<class tipoelem>
bool dizionariothc<tipoelem>::appartiene(char *k)
{
assert(tavola[h(k)].occupato);
return(tavola[h(k)].chiave == k);
}
template<class tipoelem>
void dizionariothc<tipoelem>::inserisci(tipoelem elem)
{
cout << "inserire la chiave dell'elemento " << elem << ": ";
char *key;
cin >> key;
int k = h(key);
if(tavola[k].occupato)
cout << "posizione occupata. impossibile inserire.\n\n";
else
{
tavola[k].elemento = elem;
tavola[k].chiave = key;
tavola[k].occupato = true;
numbucket++;
}
}
template<class tipoelem>
void dizionariothc<tipoelem>::cancella(char *k)
{
if(appartiene(k))
{
tavola[h(k)].occupato = false;
numbucket--;
}
else
cout << "chiave non presente nel dizionario.\n\n";
}
template<class tipoelem>
tipoelem dizionariothc<tipoelem>::recupera(char *k)
{
assert(appartiene(k));
return(tavola[h(k)].elemento);
}
template<class tipoelem>
void dizionariothc<tipoelem>::aggiorna(char *k, tipoelem elem)
{
assert(appartiene(k));
tavola[h(k)].elemento = elem;
}
testdizionari.cpp
codice:
#include "dizionario.h"
#include "dizionariothc.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
dizionariothc<char *> D;
D.test();
system("pause");
return 0;
}
l'istruzione che va in crash è quella in rosso nel file dizionario.h