Implementácie

Vyhµadávanie pri metóde Coalesced chaining

 
 
//riadok (riadok) rozptylovej tabuklky pre zretazene rozptylovanie metodou coalesced chaining
class CRiadok_ZR_CCH {
	int hodnota_;		//hodnota polozky
	bool prazdna_;		//priznak, ci je riadok prazdna
	int nasledujuca_p_;	//index nasledujucej polozky
public:
.
.
.
};

//rozptylova tabulka so zretazenym rozptylovanim - coalesced chaining
class CTabulka_ZR_CCH : public CRiadok_ZR_CCH{
	//rozptylova tabulka
	CRiadok_ZR_CCH tabulka_[POCET_POLOZIEK_V_TABULKE];
	//statisticke premenne na analyzu uspesnosti vkladania prvkov do tabulky
	int p_pokusov_;
	int p_najdeni_;
	int p_posunuti_;
public:
.
.
.
};


//najdenie zadanej hodnoty "hodnota" v rozptylovej tabulke "tabulka"
//s poctom riadkov "p_riadkov" so zretazenym rozptylovanim metodou coalesced chaining
//funkcia vracia index polozky v ktorej bola hodnota najdena (v pripade neuspechu vracia -1)
int najdi_ZR_CCH(CRiadok_ZR_CCH* tabulka, int p_riadkov, int hodnota) {
	int riadok = hodnota % p_riadkov;
	if (tabulka[riadok].prazdna()) return -1;
	else if (tabulka[riadok].hodnota()==hodnota) return riadok;
	
	while ((riadok = tabulka[riadok].nasl_p())!=-1) {
		if (tabulka[riadok].hodnota()==hodnota) return riadok;
	}
	return -1;
}
 
//vlozenie zadanej hodnoty "hodnota" do rozptylovej tabulky "tabulka"
//s poctom riadkov "p_riadkov" so zretazenym rozptylovanim metodou coalesced chaining
//funkcia vracia index polozky do ktorej bola hodnota vlozena (v pripade neuspechu vracia -1)
int vloz_ZR_CCH(CRiadok_ZR_CCH* tabulka, int p_riadkov, int hodnota) {
	int pokus=0;
	int riadok = hodnota % p_riadkov;
	if (tabulka[riadok].prazdna()) {
		tabulka[riadok].nastav_hodnotu(hodnota);
		tabulka[riadok].nastav_priznak(false);
		return riadok;
	}
	else if (tabulka[riadok].nasl_p()==-1) {
		int predch = riadok;
		while (pokus < POCET_POLOZIEK_V_TABULKE) {
			pokus++;
			riadok = rnd_i(POCET_POLOZIEK_V_TABULKE);
			if (tabulka[riadok].prazdna()) {
				tabulka[riadok].nastav_hodnotu(hodnota);
				tabulka[riadok].nastav_priznak(false);
				tabulka[predch].nastav_nasl_p(riadok);
				return riadok;
			}
		}
	}
	else while (pokus < POCET_POLOZIEK_V_TABULKE) {
		pokus++;
		riadok = tabulka[riadok].nasl_p();
		if (tabulka[riadok].nasl_p()==-1) {
			int predch = riadok;
			while (pokus < POCET_POLOZIEK_V_TABULKE) {
				pokus++;
				riadok = rnd_i(POCET_POLOZIEK_V_TABULKE);
				if (tabulka[riadok].prazdna()) {
					tabulka[riadok].nastav_hodnotu(hodnota);
					tabulka[riadok].nastav_priznak(false);
					tabulka[predch].nastav_nasl_p(riadok);
					return riadok;
				}
			}
		}
	}
	return -1;
}