m atrancado y no puedo seguir!!! S O S

dosser
13 de Agosto del 2004
tengo el siguiente codigo y no me deja operar con las estructuras de listas desde esta clase. La clase lista esta mas que probada. El codigo es para hacer una tabla hash,. La estructura es un doble puntero a un array de punteros a listas del tipo ciudad. no me deja operar con las funciones de las listas.porfa dadme ideas!!!!!!!! me da problemas donde estan las flechas, con lo que he probado, seguro que se cuelga en mas sitios. Dame ideas!!!!!

este es el codigo:(tablaHash.h)

#include<iostream.h>
#include<math.h>
#include<string.h>
///#include"cadena.hpp"
#include"Clista.hpp"
//#include"ciudad.hpp"

class tablaHash
{
friend class ciudad;

public:

tablaHash(int);
~tablaHash();
int hashSimple(char *);
int hashMult(char *);
int hashDiv(char *);
int busqueda(char *);
void insertar(ciudad );
void diagrama();
void calcularMedia();
void calcularDesv();
void paborrar();

//private:
int buckets;

Clista<ciudad> **puntero;//hay un fallo gordo no se puede operar con el
//TENGO QACER METODOS DE ESOS DE PUT Y GET
int *cant;
double media, desviaciont;

//variables de prueba pa sacar los errores
Clista<int> **ptrSuma;
char k;

};


tablaHash::tablaHash(int valor)
{
buckets=valor;

//array de listas de ciudades
puntero=new Clista<ciudad> *[valor];

ptrSuma=new Clista<int> *[valor];

media=0,0;
desviaciont=0,0;

//array que indica la ocupacion de los buckets
cant = new int[valor];

//inicializo el array cant
for(int j=0; j<buckets;j++)
cant[j]=0;


//CREO QUE ESTO ESTA BIEN
//inicializo el array de punteros a listas
for(int h=0; j<buckets;h++)
{
puntero[j]=new Clista<ciudad>();
ptrSuma[j]=new Clista<int>();
}
cout<<"creo bien";
cin>>k;
}


tablaHash::~tablaHash()
{
delete [] cant;
delete [] puntero;
delete [] ptrSuma;

}


int tablaHash::hashSimple(char *palabra)
{
int valor =0;

for(int i=0; i<(int)strlen(palabra);i++)
//valor = valor + (int) *(c+i);
valor = valor + (int) *(palabra+i);
cout<<"salgo en hash simple"<<"n";
return (int)fmod((double)valor,(double)buckets);

}


int tablaHash::hashMult(char *palabra)
{
int valor =0;
const unsigned long cte_hash=2654435769u;///tengo dudas sobre este numero

for(int i=0; i<(int)strlen(palabra);i++)//no se si es o ó cero
valor = (valor +(int) *(palabra+i)) * cte_hash;


return (int)fmod((double)valor,(double)buckets);
}

int tablaHash::hashDiv(char *palabra)
{
double valor =0;
int base=227;
int primerCaracter=32;

for(int i=0; i<(int)strlen(palabra);i++)
//for(int i=0; *(c+i)!="";i++ )//no se si es o ó cero
valor = fmod((double)((valor*base)+(int) *(palabra+i)- primerCaracter),(double)buckets);


return (int)valor;
}

//devuelve 1 si ha sido encontrado
int tablaHash::busqueda(char *palabra)
{
int pos=0, encontrado=0;
pos=this->hashSimple(palabra);

Cnodo<ciudad> *ptr;
cout<<"entro en la busqueda n";
cin>>k;

if(this->puntero[pos]->vacia()!=0)// <<<---------
{

cin>>k;
cout<<"entro en la busqueda en el 2º nivel";

ptr=this->puntero[pos]->lista; //->primerPtr;

while(ptr!=NULL && encontrado!=1)
{
if(strcmp((ptr->dato).nom,palabra)==0)
encontrado=1;
else
ptr=ptr->sig;
}
}
cout<<"salgo de la busqueda";

cin>>k;
return encontrado;

}


void tablaHash::insertar(ciudad city)
{
cout<<"estoy dentro de insertar"<<"n";
int pos;
/*if(this->busqueda(city.nom)==1)
{}
else
{*/
pos=this->hashSimple(city.nom);


cin>>k;
this->puntero[pos]->push(city);// <<<-----------
//}
}


void tablaHash::diagrama()
{
//int salida=0;
cout << "Este es el histograma de la tabla HASH n";

for(int i=0; i<buckets;i++)
{
cout << i;
for(int j=0; j<*(cant+i);j++)
cout << "*";

cout << "n";
}

}


void tablaHash::calcularMedia()
{
int valor=0;

for(int h=0;h<buckets;h++)
//valor = valor + cantidad[h];
valor = valor + *(cant+4*h);

media=valor/buckets;
}


void tablaHash::calcularDesv()
{
double auxi;
for(int j=0; j<buckets;j++)
auxi= auxi + (cant[j] * cant[j] - media*media);
//auxi= auxi+ (*(cant+4*j) * *(cant+4*j)-media*media);

desviaciont=sqrt(auxi/buckets);
}


void tablaHash::paborrar()
{
cout<<"entro en paborrar";
cin>>k;
//voy a crear una lista de enteros y a ver si me deja operar
//Clista<int> *suma=new Clista<int>();
this->ptrSuma[buckets-1]->push(5);
//suma->push(4);
//suma->push(6);
///delete suma;
}

///****************************************************////////
la clase para probar: pruebaTabla.cpp

#include<iostream.h>
//#include "Clista.hpp"
#include "ciudad.hpp"
#include "tablaHash.h"


int main()
{
cout<<"Empiezo...n";

char *azul ="azul";
char *verde= "verde";
char *amarillo="amarillo";
char *rojo="rojo";


ciudad almeria(azul, rojo);
ciudad cuevas(verde, amarillo);

tablaHash *tabla1= new tablaHash(5);
// cout<<"ahora voy a insertar"<<"n";
// tabla1->insertar(almeria);
tabla1->insertar(cuevas);
tabla1->paborrar();
delete tabla1;



return 0;

}

ana
13 de Agosto del 2004
No sé si he entendido muy bien tu problema y no sé si te servirá de algo este comentario.
¿Es desde la clase tablaHash desde donde no puedes acceder a los miembros de la clase ciudad?.

Si los miembros de la clase ciudad son privados no podrás acceder a ellos aunque hayas declarado todas las funciones de la clase ciudad amigas de la clase tablaHash

class tablaHash
{
friend class ciudad;


porque esto lo que hace es que sea la clase ciudad la que pueda acceder a todos los miembros de tablaHash y no al revés. Tendrías que declarar en la clase ciudad amiga a la clase tablaHash

class ciudad
{
friend class tablaHash