Doppel-Hashing Wörterbuch struct->klasse

Krikus

Mitglied
Hi,

ich habe 2 Klassen.
Klasse 1 "hash"
Klasse 2 "woerter"

Nun würde ich gerne den struct aus Klasse "hash" durch durch die Klasse "worter" ersetzen.

Ich würde es so machen:


C++:
private:
//struct löschen
woerter a[79];

Allerdings weiß ich nun nicht genau wie ich die Methode dh_insert abändern muss.

C++:
class hash
{
private:
		struct Element 
			{string key; //deutsche Wort
			 string info; //englische Wort
			};

		Element a[79]; 

public:

	hash()
	{
	      datei_auslesen();
	}

	//########################################################

	~hash()
	{
		zurueck_schreiben();
	}
	//########################################################

	int hash(string key)       //Erste Hasfunktion
	{int h = 0; // Hashcode
	 int i, l = key.length();
	 for (i = 0; i < l; i++) h = (int(key.at(i)) + h*127) % M;
	 return h;
	}
	//########################################################
	int hash2(string key)       //Zweite Hasfunktion (=Schrittweitenfunktion)
		{int w = 0; // Schrittweite
		 int i, l = key.length();
		 for (i = 0; i < l; i++) w = (int(key.at(i)) + w*127) % (M - 1);
		 return w;
		}

	//########################################################

	int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
		{
		Element x;
		x.key = key;
		x.info = info;
		 
		int i = hash(x.key);
		 int c = hash2(x.key);
		 int last = (i + (M - 1)*c)%M;
		 while (a[i].key.length() != 0  && a[i].key != x.key && i != last) i = (i+c)%M;
		 if (a[i].key.length() == 0) // Satz einfuegen
			 {a[i].key = x.key;
			  a[i].info = x.info;
			  return 0; 			//Satz erfolgreich eingefuegt
			 }
		 if (a[i].key == x.key)
			  return 1; 			//Satz existiert schon
		 else return 2; 			//Tabelle voll; kein Einfuegen moeglich
		}

...........
};

C++:
class woerter 
{
	private:
		string key;
		string info; 

	public:

woerter(string einkey = "", string eininfo = "") 
			 : key(einkey),info(eininfo) {}

	//########################################################
	void set_key(string const& eingabe_name)
	{
		key=eingabe_name;
	}

	//########################################################

	void set_x_info(string const& eingabe_info)
	{
		info=eingabe_info;
	}

	//########################################################

	string const& get_key() const
	{
		return key;
	}

	//########################################################

	string const& get_info() const
	{
		return info;
	}
	  		
};

Wäre über ein paar tipps dankbar.
 
Zuletzt bearbeitet:
ja wo liegt das Problem? Wie möchtest du es machen. Ich würde an deiner Stelle eine std Liste benutzen, dann hast du das ganz auch dynamisch als kleiner neben Effekt.

C++:
#include <list>

typedef std::list<woerter*> woerter_list;



class hash
{
private:
     woerter_list  mylist;
 
public:
 

    int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
        {
			woerter* x = new woerter();
			x->get_key = key;
			x->get_info = info;

			mylist.push_back(x);  // fügt den Zeiger am Ende der Liste ein
                 
        }
 
 //..........
};

deine dh_insert Funktion ist irgendwie sehr komisch habe ich mir nicht wirklich angeschaut was willst du denn da überprüfen?
Ach und wenn du schon Klassen benutz wieso erstellst du kein geiegneten Kunstruktoren z.B. bei der Klasse woerter
 
Zuletzt bearbeitet von einem Moderator:
Ich habe bereits obige Problem mit einer Liste gelöst.
Ich soll aber nun diese Liste durch Doppel-Hashing ersetzen.
Das ist ja der Witz bei der Sache.

Der Konstrucktor hinzugfügt.

Hab mal ein bisschen probiert.

Bekomme alldings beim testen eine Zugriffsverletztung. (in der dh_insert Methode kommentiert)

Hier einmal der geänderte Teil:

C++:
class hash_klasse
{
private:
		struct Element 
			{string key; //deutsche Wort
			 string info; //englische Wort
			};
		int M;

		woerter a[79]; 

public:

	hash_klasse()
	{
		dh_init();
		M=79;
		
	}

	//########################################################

	~hash_klasse()
	{
		zurueck_schreiben();
	}
	//########################################################

	int dh_insert(string key, string info) //fuegt deutsch-engl. Wortpaar in Hastabelle ein
		{
		Element x;
		x.key = key;
		x.info = info;
		 
		int i = hash(x.key);
		 int c = hash2(x.key);
		 int last = (i + (M - 1)*c)%M;
		 while (a[i].get_key().length() != 0  && a[i].get_key() != x.key && i != last) i = (i+c)%M; //ZUGRIFFSVERLETZUNG
		 if (a[i].get_key().length() == 0) // Satz einfuegen
		 {
				 //a[i].key = x.key;
				 //a[i].info = x.info;
				a[i].set_key(x.key);
				a[i].set_x_info(x.info);
			  return 0; 			//Satz erfolgreich eingefuegt
			 }
		 if (a[i].get_key() == x.key)
			  return 1; 			//Satz existiert schon
		 else return 2; 			//Tabelle voll; kein Einfuegen moeglich
		}

	//########################################################
 
Zuletzt bearbeitet:
Zurück