16 aprilie 2010

Hash tables

Urmatorul program creeaza o structura de date Hash - o structura care asociaza unei anumite chei (indicele vectorului Hash[]) o lista de vectori de elemente (ale unei multimi), avand cardinalul card. Lista este simplu-inlantuita.
Se mai verifica si daca o anumita multime A poate fi acoperita de multimi de un anumit cardinal din Hash table.

#include "stdio.h"
#include "stdlib.h"

typedef struct lista {
int * elem;
int card;
struct lista *leg;
} * Hash;

void insert (int * multime,int card, Hash * L) {
Hash ins = (Hash)malloc(sizeof(struct lista));
ins->elem = multime;
ins->leg = NULL;
ins->card = card;
if (*L == NULL) {
*L = ins; return ; }
else {
Hash aux = *L;
while (aux->leg !=NULL)
aux= aux->leg;

aux->leg = ins; }
}

void printvect (int * v,int n) {

int i;
for(i=0;i < n;i++)
printf( "%d ", v[i]);
printf("\n");
}


void afisare (Hash h, int i) {

Hash aux;
if (h != NULL) {
aux = h;
printf("h[%d] = \n",i);
while (aux != NULL)
{
printvect(aux->elem,aux->card);
aux = aux->leg;
}
}
}

int exista (Hash h, int elem) {

if(h==NULL)
return 0;
Hash aux = h;
int ok =0;
while (aux) {
int c = aux->card, i;
for(i=0; i < c ; i++)
if (aux->elem[i]==elem) ok = 1;
if(ok ==1)
return 1;
aux = aux->leg;
}
return 0;

}

int main() {

Hash *h;
FILE * f = fopen("in", "r");
int n,i;
fscanf(f, "%d", &n);
h = (Hash *)malloc (n*sizeof(struct lista));
for(i=0; i < n ; i++)
h[i]= NULL;
while(!feof(f)) {
int m;
fscanf(f, "%d", &m);
int * v = (int *)malloc(m*sizeof(int));
for(i=0; i < m ;i++)
fscanf(f,"%d", &v[i]);
insert (v,m, &h[m]);
}
for(i=0; i < n ; i++)
afisare(h[i],i);

// multimea A de cardinal k poate fi acoperita de multimi de card. p din Hash table?
printf("\n\n");

FILE * ff = fopen ("in2", "r");
int *A, k,p;
fscanf(ff,"%d", &k);
A = (int *)malloc(k*sizeof(int));
for(i=0; i < k ;i++)
fscanf(ff,"%d", &A[i]);
fscanf(ff,"%d", &p);
int ok = 1;
for(i=0; i < k && ok; i++)
if(!exista(h[p], A[i]))
ok = 0;
if (ok==1) {
printf("da\n");
afisare(h[p],p);
}
else printf("nu\n");

return 0;
}

Niciun comentariu: