Cod sursa(job #1763396)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 24 septembrie 2016 13:25:30
Problema Hashuri Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include<stdio.h>
#define MOD 457867
FILE*fin = fopen("hashuri.in", "r");
FILE*fout = fopen("hashuri.out", "w");
int hash(int x) {
	return x%MOD;
}
struct nod {
	int val;
	nod*next;
};

nod lista[MOD+1];
nod* cap[MOD+1];
void InitLista()
{
	for (int i = 0; i <MOD; i++)
	{
		cap[i]=new nod;
		cap[i]->val = NULL;
		cap[i]->next = NULL;
	}
}
void Adauga(int x)
{
	nod* newborn = new nod;
	newborn->val = x;
	newborn->next = cap[hash(x)];
	cap[hash(x)] = newborn;
}
void Sterge(int x)
{
	nod*ptr = new nod;
	ptr->val = cap[hash(x)]->val;
	ptr->next = cap[hash(x)]->next;
	if (cap[hash(x)]->val == x)
	{
		cap[hash(x)]->val = NULL;
	}//nu pot sterge capul listei,asa ca il fac o fantoma
	while (ptr->next != NULL)
	{
		if ((ptr->next)->val == x)
		{
			nod* deSters = ptr->next;
			ptr->next = ptr->next->next;
			delete deSters;
		}
		ptr = ptr->next;
	}
	
}
bool Verifica(int x)
{
	nod*ptr = new nod;
	ptr->val = cap[hash(x)]->val;
	ptr->next = cap[hash(x)]->next;
	//printf("Verific daca elementul %d este in lista %d cu capul %d\n", x, hash(x),cap[hash(x)]->val);
	while (ptr->next!= NULL)
	{
		if (ptr->val == x)
		{
			//printf("Aici sunt!\n");
			return 1;
		}
		ptr = ptr->next;
	}
	return 0;
}
int main(){
	InitLista();
	int Q; 
	int x, type;
	fscanf(fin, "%d", &Q);
	for (int i = 1; i <= Q; i++)
	{
		fscanf(fin, "%d%d", &type, &x);
		switch (type)
		{
		case 1:
			Adauga(x);
			//printf("Am adaugat elementul %d la lista %d\n", x,hash(x));
			break;
		case 2:
			Sterge(x);
			//printf("Am sters elementul %d din lista %d\n", x,hash(x));
			break;
		case 3:
			fprintf(fout, "%d\n", Verifica(x));
			//printf("Am verificat daca elementul %d este in tabel si %s este\n", x,Verifica(x)?"":"nu");
			break;
		}
	}
	return 0;
}