Cod sursa(job #1045507)

Utilizator flaviusc11Fl. C. flaviusc11 Data 1 decembrie 2013 17:59:26
Problema Hashuri Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <fstream>

using namespace std;

const int dim_hash = 1000003;


typedef struct _El
{
	int	data;
	_El *urm;
}El;


bool	HTinsert( int data);
bool	HTsearch(int data);
bool	HTdeleteData( int data);
void	HTdeleteHash();


El*	HT[1000003];

int main()
{
	int		nr;
	int		op, x;

	ifstream in("hashuri.in");
	ofstream out("hashuri.out");

	in >> nr;


	for (int i = 0; i < nr; ++i)
	{
		in >> op >> x;
		
		if (op == 1)
			HTinsert( x);
		else
		if (op == 2)
		{
			HTdeleteData( x);
		}
		else
		{
			if (HTsearch( x))
				out << 1 << '\n';
			else
				out << 0 << '\n';
		}


	}

	in.close();
	out.close();

	return 0;
}


bool HTinsert( int data)
{
	int	key = data % dim_hash;
	El	*p = HT[key];

	while (p)
	{
		if (p->data == data)
			break;

		p = p->urm;
	}

	if (p) //inseamna ca exista deja in hash
		return false;
	else
	{
		El *toInsert = new El;
		toInsert->data = data;
		toInsert->urm = HT[key];
		HT[key] = toInsert;

		return true;
	}
}

bool HTsearch( int data)
{
	int key = data % dim_hash;
	El *p = HT[key];

	while (p)
	{
		if (p->data == data)
			return true;
		p = p->urm;
	}
	return false;
}


bool HTdeleteData(int data)
{
	int	key = data % dim_hash;
	El	*p = HT[key];
	El  *toDel = HT[key];

	if (HT[key] == NULL)
		return false;
	if ( HT[key]->data == data ) //daca e primul din lista
	{
		toDel = HT[key];
		HT[key] = toDel->urm;
		delete toDel;

		return true;
	}
	while (p->urm)
	{
		if (p->urm->data == data)
			break;

		p = p->urm;
	}

	if (!p->urm)
		return false;
	else
	{
		toDel = p->urm;
		p->urm = toDel->urm;
		delete toDel;
		return true;
	}

}

void HTdeleteHash()
{
	for (int i = 0; i < dim_hash; ++i)
	while (HT[i])
	{
		El *toDel = HT[i];
		HT[i] = toDel->urm;
		delete toDel;
	}
}