Cod sursa(job #2591097)

Utilizator bogdanmicamica bogdan bogdanmica Data 29 martie 2020 19:24:44
Problema Hashuri Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include "thash.h"

TH *initTH(size_t M,TFHash fh)
{
	TH *h = (TH*)calloc(sizeof(TH),1);
	if(!h)
	{
		printf("eroare alocare\n");
		return NULL;
	}
	h->M = M;
	h->fh = fh;
	h->v = (TLista*)calloc(M,sizeof(TLista));
	if(!h->v)
	{
		free(h);
		return NULL;
	}
	return h;
}

void distrTH(TH **ah)
{
	TLista *p,el,aux;
	int i;
	for(p = (*ah)->v ; p < (*ah)->v + (*ah)->M; p++)
	{
		for(el = *p; el != NULL;)
		{
			aux = el;
			el = el->urm;
			free(aux);
		}
	}
	free((*ah)->v);
	free(*ah);
	*ah = NULL;
}

void afiTH(TH *ah)
{
	TLista p,el;
	for(int i = 0; i < ah->M; i++)
	{
		p = ah->v[i];
		if(p)
		{
			printf("LISTA %d\n",i);
			for(el = p; el != NULL; el = el->urm)
				printf("%d ",el->info);
			printf("\n");
		}
	}
}

int existaTH(TH *a,int nr,TFCmp f)
{
int i;
int cod = a->fh(nr);
TLista el;
for(el = a->v[cod]; el != NULL; el = el->urm)
{
	if(f(el->info,nr) == 0)
		return 1;
}
return 0;
}

int insTH(TH *a,int nr,TFCmp f)
{
	int cod = a->fh(nr);
	TLista el;
	for(el = a->v[cod]; el != NULL; el = el->urm)
		if(!f(el->info,nr))
			return 0;
	int rez = insLista(a->v + cod,nr);
	return rez;
}

int extrTH(TH *a,int nr,TFCmp f)
{
	int cod = a->fh(nr);
	TLista p,prev;

	for(prev = NULL, p = a->v[cod]; p != NULL; prev = p, p = p->urm)
		{
			if(!f(p->info,nr))
			{
				TLista aux = p;
				if(prev)
				prev->urm = p->urm;
				else
					p = p->urm;
				free(aux);
				return 1;
			}
		}
return 0;
}