#include<iostream>
using namespace std;
struct Cvor{
int broj;
Cvor *sljedeci;
};
struct HashZapis{
Cvor *pok;
HashZapis *sljedeci;
};
Cvor *headListe=NULL;
Cvor *iniCvor(int br) {
Cvor *novi=new Cvor();
novi->broj=br;
novi->sljedeci=NULL;
return novi;
}
#define VELICINA_TABELE 100
unsigned int hash(int vrednost) {
return abs(vrednost) % VELICINA_TABELE;
}
HashZapis *hashTabela[VELICINA_TABELE];
void dodajUlistu(Cvor *novi) {
if(headListe==NULL)
headListe=novi;
else {
novi->sljedeci=headListe;
headListe=novi;
}
}
void ispisListe() {
if(headListe==NULL)
cout<<"Prazna lista."<<endl;
else {
Cvor *temp=headListe;
while(temp!=NULL) {
cout<<temp->broj;
temp=temp->sljedeci;
}
}
}
/*
prethodnik[in] - pokazivac na element u listi koji je prethodnik elementu koji zelimo da obrisemo
*/
void obrisiElementIzListe(Cvor *prethodnik) {
if(prethodnik == 0) return;//Ne zelimo da ispadnemo budale, te ako je argument NULL pointer, sa prezirom cemo izignorisati celu operaciju.
Cvor *zaBrisanje = prethodnik->sljedeci;
if(zaBrisanje == 0) return; //ovo je kraj liste, trazeni element ni ne postoji ili je u pitanju neka greska.
prethodnik->sljedeci = zaBrisanje->sljedeci;//prevezujemo elemente liste
free(zaBrisanje);//ili delete zaBrisanje - vidi 3. b)
return;// moze, a i ne mora da stoji
}
int dajVrednostPodatka(HashZapis *zapis) {
if(zapis == 0) return 0;
Cvor *prethodnik = zapis->pok->sljedeci;
if(prethodnik == 0) return 0;
if(prethodnik->sljedeci == 0) return 0;
//ok, sada mozemo da dohvatimo podatak
return prethodnik->sljedeci->broj;
}
HashZapis *dajRedIzHashTabele(int kljuc){
unsigned int indeks = hash(kljuc);
HashZapis *rezultat = hashTabela[indeks];
return rezultat;
}
/*
kljuc[in] - kljuc koji se odnosi na elemente cije duplikate valja izbaciti
return broj obrisanih elemenata
*/
unsigned int izbaciDuplikate(int kljuc) {
unsigned int rezultat = 0;
HashZapis *redUHashTabeli = dajRedIzHashTabele(kljuc);
if(redUHashTabeli == 0) return 0;
//trazimo original
while(redUHashTabeli) {
if(kljuc == dajVrednostPodatka(redUHashTabeli)) break;//nasli smo ga
redUHashTabeli = redUHashTabeli->sljedeci;
}
if(redUHashTabeli == 0) return 0;//nismo nasli ni original
HashZapis *prethodni = redUHashTabeli;//trebace nam za brisanje duplikata iz Hash tabele
redUHashTabeli = redUHashTabeli->sljedeci;//prvi posle originala
while(redUHashTabeli) {
if(kljuc == dajVrednostPodatka(redUHashTabeli)) {
//duplikat - obrisacemo ga
obrisiElementIzListe(redUHashTabeli->pok);
//sada da izbacimo i ovaj hash zapis
prethodni->sljedeci = redUHashTabeli->sljedeci;
free(redUHashTabeli);//ili delete redUHashTabeli;
++rezultat;
} else {
prethodni = redUHashTabeli;
}
redUHashTabeli = prethodni->sljedeci;
}
return rezultat;
}
void napraviTabelu(Cvor *headListe) {
//inicijalizacija
for(int i = 0; i < VELICINA_TABELE; ++i) {
hashTabela = NULL;
}
//glavna prica
if(headListe == NULL) return;
Cvor *prethodni = headListe;
Cvor *zaObradu = headListe->sljedeci;
while(zaObradu) {
HashZapis *zapis = (HashZapis *) malloc(sizeof(HashZapis));
zapis->pok = prethodni;
unsigned int indeks = hash(zaObradu->broj);
HashZapis *sledeci = hashTabela[indeks];
zapis->sljedeci = sledeci;
hashTabela[indeks] = zapis;
prethodni = zaObradu;
zaObradu = zaObradu->sljedeci;
}
return;
}
int main(){
int opcija;
int b;
while(opcija!=0){
cout<<"<<MENI>>"<<endl;
cout<<"1.DODAJ CVOR NA POCETAK."<<endl;
cout<<"2.ISPIS LISTE."<<endl;
cout<<"3. hashiraj "<<endl;
cout<<"4. ispisi vrijednost na osnovu unesenog kljuca:"<<endl;
cout<<"0.IZLAZ."<<endl;
cin>>opcija;
switch(opcija) {
case 1: {
Cvor *n=new Cvor();
cout<<"Unesi broj:"<<endl;
cin>>b;
n=iniCvor(b);
dodajUlistu(n);
cout<<endl;
break;
}
case 2: {
cout<<"ISPIS LISTE:"<<endl;
ispisListe();
cout<<endl;
break;
}
case 3:{
//for(int i = 0; i < VELICINA_TABELE; ++i) {
// izbaciDuplikate(i);
//}
napraviTabelu(headListe);
break;
}
case 4:{
int k;
cout<<"unesi kljuc"<<endl;
cin>>k;
cout<<"vrijednost tog kljuca je"<<dajVrednostPodatka(hashTabela[k]);
break;
}
}
}
cout<<endl;
system("pause");
return 0;
}
ewo cjeli program sto sam sklopio, ako moze neko naci gresku bio bih zahvalan




Re: izbacivanje duplikata iz liste uz pomoc hash tabele
