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;
}



#endif
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;
}
E questi sono gli errori che mi da:

-------------------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