Académique Documents
Professionnel Documents
Culture Documents
Tabele de Dispersie
Tabele de Dispersie
#include<iostream>
using namespace std;
struct Student{
char* nume;
int nrNote;
int* note;
};
struct nod{
Student stud;
nod* next;
};
struct HashTable{
int dim;
(nod*) *vector;
};
HashTable initializareHash(int dim)
{
HashTable h;
h.dim=dim;
h.vector=new nod*[dim];
return h;
}
//functia hash, care va procesa numele studentului si va determina pozitia pe care ar
trebui sa se afle acesta in tabel
int fctHash(char* input, int n)
{ //n=dimensiunea hash-table-lui
int suma=0;
for(int i=0; i<strlen(input); i++)
suma += input[i];
return suma%n;
}
nod* creareNod(Student s)
{
nod* nou= new nod();
nou->next=NULL;
nou->stud=s;
return nou;
}
//inserare la inceputul listei listei
nod* inserareNod(nod* capat,Student s)
{
nod* nou= creareNod(s);
if(capat==NULL) {capat=nou; return capat;}
else
{
nou->next=capat;
capat=nou;
return capat;
}
}
void inserareInHash(HashTable ht, Student s)
{
void main() {
HashTable h ;
/*h.n = 256;
h.tabel= new Student[h.n];*/
initializare(h,256);
FILE *f;
f= fopen("stud.txt","r");
Student st;
//populare tabela de dispersie cu linear probing
fscanf(f,"%d",&st.id);
while(!feof(f))
{
char buf[100], pren[100];
fscanf(f,"%s",buf);
strcat(buf, " ");
fscanf(f,"%s",pren);
strcat(buf, pren);
st.nume=new char[strlen(buf)+1];
strcpy(st.nume,buf);
fscanf(f, "%s", buf);
st.grupa=new char[strlen(buf)+1];
strcpy(st.grupa,buf);
int i=inserare(h,st);
if(i==-1)
cout<<"Problema inserare - Tabela este plina. Inserare se opreste
la studentul cu id-ul "<<st.id<<")."<<endl;
else
if(!i)
cout<<"Inserare cu succes"<<endl;
else
cout<<"A fost o problema la inserare!Inserare se
opreste la studentul cu id-ul "<<st.id<<")."<<endl;
fscanf(f,"%d",&st.id);
}
cout<<endl;
afisare(h);
cout<<endl;
//dezalocare tabela de dispersie
for(int i=0;i<h.n;i++)
{ if(h.tabel[i].id!=-1) {
delete[] h.tabel[i].nume;
delete[] h.tabel[i].grupa;} }
delete[] h.tabel;
//
f = fopen();
fclose(f);
}
HEAP
#include<iostream>
using namespace std;
struct transferBancar{
char* titular;
char IBAN[50];
char* titularDest;
char IBANdestinatie[50];
int valoare;
int prioritate;
};
struct heap{
transferBancar* coadaMesaje;
int nrMesaje;
int dimCoada;
};
//functie de initializare heap
heap initHeap(int dimInit)
{
heap h;
h.coadaMesaje=new transferBancar[dimInit];
h.nrMesaje=0;
h.dimCoada=dimInit;
return h;
}
//functie de redimensionare heap
heap redimHeap(heap h, int DimNoua)
{
heap nou;
nou.dimCoada=DimNoua;
nou.coadaMesaje=new transferBancar[DimNoua];
nou.nrMesaje=h.nrMesaje;
for(int i=0; i<h.dimCoada;i++)
nou.coadaMesaje[i]=h.coadaMesaje[i];
delete[]h.coadaMesaje;
return nou;
}
//functie de determinare parinte
int parinte(int j)
{
return (j-1)/2;
}
//functii de determinare a pozitiilor din vector a copiiilor
int FiuSt(int j)
{
return (j*2)+1;
}
int FiurDr(int j)
{
return (j+1)*2;
}
heap adaugareHeap(heap h, transferBancar tr)
{
if(h.dimCoada==h.nrMesaje) h=redimHeap(h,h.dimCoada*2);
else
{
//adaugam la capat, iar apoi incepem sa comparam cu parintii succesiv, pana
cand parinti/copii sunt pusi in ordinea descresc a prioritatii
//sau pana cand ajung in varf(primul element)
h.coadaMesaje[h.nrMesaje]=tr;
//pozitia curenta
int j=h.nrMesaje;
h.nrMesaje++;
while(true)
{
if(j==0) break;
int i=parinte(j);
if(tr.prioritate>h.coadaMesaje[i].prioritate)
{
//interschimbare
transferBancar aux = h.coadaMesaje[i];
h.coadaMesaje[i] = h.coadaMesaje[j];
h.coadaMesaje[j]=aux;
j=i;
}
else break; //parintele are prioritatea mai mare, ceea ce este ok.
}
}
return h;
void afisareHeap(heap h)
{
transferBancar tr;
for(int i=0; i<h.nrMesaje;i++)
{tr = h.coadaMesaje[i];
printf("%s, cu IBAN %s, transfera %d, catre %s, cu IBAN %d'\n",tr.titular,
tr.IBAN, tr.valoare, tr.titularDest, tr.IBANdestinatie);}
}
void main()
{
heap h= initHeap(40);