TableHash

cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012 - 23 févr. 2009 à 13:57
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012 - 2 mars 2009 à 16:50
voila le code que j'ai pour une seule table hash

// Constructeur de la classe TableHash
CTableHash::CTableHash()
{
 maliste=new (dblist);
}

//initialisation  de la table
void CTableHash::init(CTableHash *a)
{
a->liste->first=NULL;
a->liste->last=NULL;
 for(int i=0;i<=NGmax;i++)
 for(int j=0;j<=i;j++)


 a->t[i][j]=NULL;
 nbelem=0;


}


void CTableHash::ajoute_noeud(int x,int y,CTableHash *t )
{
ListeNode *nouv= new (ListeNode);
nouv->x1=x;
nouv->x2=y;
nouv->prob=1;
nouv->next=NULL;
t->t[x][y]=nouv;


 if (t->liste->last) t->liste->last->next=nouv;
 else t->liste->first=nouv;
 t->liste->last=nouv;
 nbelem++;
}


CTableHash::~CTableHash()
{
 delete  liste;


}


void CTableHash::clear_liste(CTableHash *a)
{
 ListeNode *nouv;
 ListeNode *pliste=a->maliste->first;
 while(pliste)
 {
  nouv=pliste;
  pliste=pliste->next;
  delete (nouv);
  }
  delete pliste;
  a->maliste->first=NULL;
  a->maliste->last=NULL;
  nbelem=0;
}


Maintenant je veux programmer plusieur table mais je n'arrive pas.

10 réponses

uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 févr. 2009 à 13:10
Salut,
D'une part, ce n'est pas du C, d'autre part tu ne montre pas la déclaration de la classe.
Sinon, pour créer plusieurs hashtables, comme n'importe quelle autre variable :

//Déclaration
CTableHash table1, table2;
//Utilisation
table1.methode();
table2.methode();

Non ?
Par contre, je crois que tu n'utilises pas ta classe correctement : pour y a t-il un pointeur sur CTableHash à chaque méthode ? Le but d'une méthode est de modifier l'instance courante, symbolisée par (*this).
Ainsi, par exemple :

void CTableHash::ajoute_noeud(int x,int y)
{
ListeNode *nouv= new (ListeNode);
nouv->x1=x;
nouv->x2=y;
nouv->prob=1;
nouv->next=NULL;
this->t[x][y]=nouv;

 if (this->liste->last) this->liste->last->next=nouv;
 else this->liste->first=nouv;
 this->liste->last=nouv;
 nbelem++;
}

Et encore, je ne sais pas à quoi correspond t->t[][] (ça a l'air assez improbable), vu que tu ne montres pas la déclaration de la classe.

Au cas où, voici un simple exemple de classe :
//Déclaration de la classe
class CPersonne {
public:
void Changer_age(int Age);
private:
int age;
char* nom[25];
};
//Constructeur
CPersonne:CPersonne(int Age,char* Nom) {
this->age=Age;
strcpy(this->nom,Nom);
}
//Méthode Changer_Age()
void CPersonne::Changer_Age(int Age) {
this->age=Age;
}
//Déclaration de 2 instances
CPersonne personne1(28,"Simon");
CPersonne personne2(41,"Pierre");
//Changement de l'age de la 2eme personne
personne2.Changer_Age(56);

J''espère ne pas trop avoir été hors-sujet.

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
24 févr. 2009 à 13:13
Oups, j'ai oublié le constructeur dans la déclaration de la classe :
//Déclaration de la classe
class CPersonne {
public:
Cpersonne(int Age,char* Nom);
void Changer_age(int Age);
private:
int age;
char* nom[25];
};

Cordialement, uaip.
0
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
26 févr. 2009 à 12:54
salut uaip, tu n es pas vraiment hors sujet.mais ,moi je veux afficher plusieur table au meme temps.ça veut dire plusieurs listes.
cordialement, aylan.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
26 févr. 2009 à 18:25
Salut,
Le "en même temps" en programmation n'existe pas.
Et ta question était de savoir comment programmer plusieurs hashtables, et là tu me dis que tu veux juste les afficher "en même temps". Ça n'a rien à voir.
Il suffit que tu déclares une méthode afficher(); et, en imaginant que tu aies ouvert 2 instances i1 et i2, il suffit d'écrire :
i1.afficher();
i2.afficher();
Si je suis encore hors-sujet, alors tu t'exprimes mal
(mes remarques concernant la programmation de ta classe restent néanmoins valables).

Cordialement, uaip.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
2 mars 2009 à 13:47
salut uaip,peut etre je n ai pas bien expliqué.voila le code que j'ai utilisé pour une seule table:

pour CTableHash/.cpp

// Constructeur de la classe CTableHash
CTableHash::CTableHash()
{
 maliste=new (dblist);
}
void CTableHash::init(CTableHash *a)
{
a->maliste->first=NULL;
a->maliste->last=NULL;
 for(int i=0;i<=NGmax;i++)
 for(int j=0;j<=i;j++)

 a->t[i][j]=NULL;
 nbelem=0;

}

void CTableHash::ajoute_noeud(int x,int y,CTableHash *t )
{
ListeNode *nouv= new (ListeNode);
nouv->x1=x;
nouv->x2=y;
nouv->prob=1;
nouv->next=NULL;
t->t[x][y]=nouv;

 if (t->maliste->last) t->maliste->last->next=nouv;
 else t->maliste->first=nouv;
 t->maliste->last=nouv;
 nbelem++;
}

CTableHash::~CTableHash()
{
 delete  maliste;

}

void CTableHash::clear_liste(CTableHash *a)
{
 ListeNode *nouv;
 ListeNode *pliste=a->maliste->first;
 while(pliste)
 {
  nouv=pliste;
  pliste=pliste->next;
  delete (nouv);
  }
  delete pliste;
  a->maliste->first=NULL;
  a->maliste->last=NULL;
  nbelem=0;
}

void CTableHash::afficher_liste(CTableHash *TableHash,class TInfoListeMat *InfoListeMat)
{
int i=1;double s=0;
InfoListeMat->ListBox1->Clear();
ListeNode *pliste=TableHash->maliste->first;
InfoListeMat->ListBox1->Items->Add("La longeur de la Liste est:"+IntToStr(nbelem));
while(pliste)
{
s=s+(pliste->prob);
InfoListeMat->ListBox1->Items->Add(IntToStr(i)+" la paire : ("+IntToStr(pliste->x1)+","+IntToStr(pliste->x2)+") cooccurrence :"""+FloatToStr(pliste->prob));
pliste=pliste->next;
i++;

}
InfoListeMat->ListBox1->Items->Add(" La somme de cooccurrence :" +FloatToStr(s));
};

//pour CTableHash.h

#ifndef CTableHashH
#define CTableHashH
//---------------------------------------------------------------------------
#endif
/*Classe pour la table de hachage*/
class CTableHash
{
 public:
 struct dblist *maliste;
 struct ListeNode *t[256][256];
 int nbelem;
 public:
 CTableHash();
 ~CTableHash();
 void init(CTableHash *);

 void ajoute_noeud(int,int,CTableHash *);

 void clear_liste(CTableHash *);

 void afficher_liste(CTableHash *,class TInfoListeMat *InfoListeMat );

};

pour le traitement <main.cpp>

 {
                               ptr = (Byte *)ptrBitmap->ScanLine[k];
                               ptr1 = (Byte *)ptrBitmap->ScanLine[k+x-(Height_Str-1)/2];
                               int a=ptr[L];
                               int b=ptr1[L+y-(Width_Str-1)/2];
                               if(a>=b)
                                {
                               if(!TableHash->t[a][b])
                               TableHash->ajoute_noeud(a,b,TableHash);

                                else TableHash->t[a][b]->prob++;
                                }
                              else
                              {
                                if(!TableHash->t[b][a]) TableHash->ajoute_noeud(b,a,TableHash);

                                else TableHash->t[b][a]->prob++;
                               }
                              nL+=1;

                               Application->ProcessMessages();
                           

Avec tous mes remerciement/
0
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
2 mars 2009 à 13:58
plus exactement je veux programmer 5 table de hachage.
est-ce-que il y a une possibilité de faire un vecteur de 5 table.
0
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
2 mars 2009 à 14:27
pour une seule table voila comment je déclare la table hash
CTableHash *TableHash;
 delete TableHash;
TableHash= new (CTableHash);


  TableHash->init(TableHash);
  TableHash->clear_liste(TableHash);
mais pour plusieur table comment ?
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
2 mars 2009 à 15:46
Tu n'as pas compris mes mesages...

Cordialement, uaip.
0
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
2 mars 2009 à 16:24
salut uaip, oui, je n ai pas compri ce que tu veux dire.
0
cs_aylan Messages postés 13 Date d'inscription lundi 17 novembre 2008 Statut Membre Dernière intervention 12 juin 2012
2 mars 2009 à 16:50
est ce que tu peux m'expliquer plus.
0
Rejoignez-nous