Salve, stavo provando a scrivere un programma che implementi un dizionario tramite tabelle hash e che risolva le collisioni tramite liste concatenate..me lo compila ma nn lo linka.
Questo è il codice:
codice://dizionario.h //Implementazione di un dizionario tramite programmazione generica[template] #ifndef DIZ_H #define DIZ_H #include <cmath> template<class T,class S>class Dizionario{ public: Dizionario(int DimensioniTabella=100,double constA=0.445){ if(DimensioniTabella=!0){ Tabella=new Lista[DimensioniTabella]; } } ~Dizionario(){delete []Tabella;} class Lista{ public: Lista(){PrimoElemento=0;NumElementiDellaLista=0;} class Elemento { public: Elemento(){ ElementoSuccessivo=0; ElementoPrecedente=0; chiave=0; } ~Elemento(){} Elemento * ElementoPrecedente; Elemento * ElementoSuccessivo; T chiave; S datoSatellite; }; bool InserisciElemento(T,S); S Ricerca(T); S Cancella(T); int RestituisciNumElementi(){return NumElementiDellaLista;} bool SettaPrimoElemento(Elemento *q){PrimoElemento=q} Elemento *RestituisciPrimoElemento(){return PrimoElemento;} private: Elemento *PrimoElemento; static int NumElementiDellaLista; }; bool InserisciChiave(T,S); S EliminaChiave(T); S RicercaChiave(T); int FattoreDiCarico(); int RestituisciDimensioniTab(){return DimensioniTabella;} protected: virtual unsigned long ConvertiChiave(T); double constA; int DimensioniTabella; int GeneraHashVal(T); Lista *Tabella; }; //funzioni classe Lista template <class T,class S>bool Dizionario<T,S>::Lista::InserisciElemento(T chiave,S dato){ Elemento *x=new Elemento(); Elemento *y=0; y=RestituisciPrimoElemento(); x->chiave=chiave; x->datoSatellite=dato; if(y==0){SettaPrimoElemento(x);} else{ do{ y=y->ElementoSuccssivo; }while(y->ElementoSuccssivo!=0); y->ElementoSuccssivo=x; x->ElementoPrecedente=y; NumElementiDellaLista++; return 1; } } template <class T,class S>S Dizionario<T,S>::Lista::Ricerca(T chiave){ Elemento *y=0; y=RestituisciPrimoElemento(); while((y!=0) && (y->chiave!=chiave)){ y=y->ElementoSuccessivo;} return y->datoSatellite; } template <class T,class S>S Dizionario<T,S>::Lista::Cancella(T chiave){ Elemento *y=0; y=Ricerca(chiave); if((y!=0)&&(y->chiave==chiave)){ y->ElementoPrecedente->ElementoSuccessivo=y->ElementoSuccessivo; if(y->ElementoSuccessivo!=0){ y->ElementoSuccessivo->ElementoPrecedente=y->ElementoPrecedente; } NumElementiDellaLista--; return y->datoSatellite; }else{ return 0; } } //Funzioni classe Dizionario template <class T,class S>int Dizionario<T,S>::FattoreDiCarico(){ double media; int dim=RestituisciDimensioniTab(); for(int i=0;i<dim;i++){ media=media + Tabella[i].RestituisciNumElementi(); } media=media/dim; return media; } template <class T,class S>int Dizionario<T,S>::GeneraHashVal(T chiave){ int dim=RestituisciDimensioniTab(); unsigned long val=ConvertiChiave(chiave); double HashFunzDouble=(fmod((constA*val),1)*dim); double fraz=modf(HashFunzDouble,&HashFunzDouble); int HashFunz=(int)HashFunzDouble; return HashFunz; } template <class T,class S>bool Dizionario<T,S>::InserisciChiave(T chiave,S dato){ int hashVal=GeneraHashVal(chiave); if(Tabella[hashVal].InserisciElemento(chiave,dato)){return 1;} return 0; } template <class T,class S>S Dizionario<T,S>::RicercaChiave(T chiave){ int hashVal=GeneraHashVal(chiave); S dato=Tabella[hashVal].Ricerca(chiave); if(dato!=0){return dato;} return 0; } template <class T,class S>S Dizionario<T,S>::EliminaChiave(T chiave){ int hashVal=GeneraHashVal(chiave); S dato=Tabella[hashVal].Cancella(chiave); if(dato!=0){return dato;} return 0; } template <class T,class S>unsigned long Dizionario<T,S>::ConvertiChiave(T chiave){ unsigned long a=(unsigned long)chiave; return a; } #endifE questi sono gli errori che mi da:codice:#include "dizionario.h" #include <iostream> using namespace std; int main(){ Dizionario<int,char> diz(10); diz.InserisciChiave(2,'a'); diz.InserisciChiave(6,'x'); diz.InserisciChiave(8,'q'); char qq=diz.RicercaChiave(5); cout<<qq<<endl; char aa=diz.RicercaChiave(2); cout<<aa<<endl; diz.EliminaChiave(2); char bb=diz.RicercaChiave(2); cout<<bb<<endl; return 0; }
-------------------Configuration: diz - Win32 Debug--------------------
Linking...
diz.obj : error LNK2001: unresolved external symbol "private: static int Dizionario<int,char>::Lista::NumElementiDellaLista " (?NumElementiDellaLista@Lista@?$Dizionario@HD@@0HA )
diz.obj : error LNK2001: unresolved external symbol "public: bool __thiscall Dizionario<int,char>::Lista::InserisciElemento(int ,char)" (?InserisciElemento@Lista@?$Dizionario@HD@@QAE_NHD @Z)
diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Cancella(int)" (?Cancella@Lista@?$Dizionario@HD@@QAEDH@Z)
diz.obj : error LNK2001: unresolved external symbol "public: char __thiscall Dizionario<int,char>::Lista::Ricerca(int)" (?Ricerca@Lista@?$Dizionario@HD@@QAEDH@Z)
Debug/diz.exe : fatal error LNK1120: 4 unresolved externals
Error executing link.exe.
diz.exe - 5 error(s), 0 warning(s)
Spero possiate aiutarmi.
Grazie

Rispondi quotando