Cod sursa(job #2456289)

Utilizator Neri-kunNeri-kun Neri-kun Data 14 septembrie 2019 09:41:23
Problema Hashuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.45 kb

#include<fstream>
using namespace std;
#define HASH_TABLE_SIZE 666013
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
typedef struct Node {
	int data;
	struct Node* next;
}Node;
void Hash_Table_Add_Element(int requested_element);
void Hash_Table_Pop_Element(int requested_element);
bool Is_Element_Hash_Table(int requested_element);
Node* head[HASH_TABLE_SIZE];
int main()
{
	int no_operations;
	int operation_choice;
	int no_requested_user;
	for (fin >> no_operations;no_operations;no_operations--) {
		fin >> operation_choice>>no_requested_user;
		switch (operation_choice) {
		case 1:
			if (!(Is_Element_Hash_Table(no_requested_user)))
			Hash_Table_Add_Element(no_requested_user);
			break;
		case 2:
			if(Is_Element_Hash_Table(no_requested_user))
			Hash_Table_Pop_Element(no_requested_user); 
				break;
		case 3:
			if (Is_Element_Hash_Table(no_requested_user))
				fout <<"1"<<endl;
			else
				fout <<"0"<<endl;
			break;
		}
	}
	return 0;
}
void Hash_Table_Add_Element(int requested_element) {
	int key = requested_element % HASH_TABLE_SIZE;
	Node* temp = new Node;
	temp->data = requested_element;
	temp->next = head[key];
	head[key] = temp;
		
}
void Hash_Table_Pop_Element( int requested_element) {

		
		
			/*Node* traversal_pointer = head[requested_element%HASH_TABLE_SIZE];
			if (traversal_pointer->data == requested_element && traversal_pointer->next == NULL){
				head[requested_element%HASH_TABLE_SIZE] = NULL;
				return;
				}
			else if (traversal_pointer->data == requested_element && traversal_pointer->next != NULL)
				head[requested_element % HASH_TABLE_SIZE] = head[requested_element % HASH_TABLE_SIZE]->next;
			while (traversal_pointer->next != NULL) {
				if (traversal_pointer->next->data == requested_element && traversal_pointer->next->next == NULL) {
					traversal_pointer->next = NULL;
					break;
				}
				else if (traversal_pointer->next->data == requested_element && traversal_pointer->next->next != NULL) {
					traversal_pointer = traversal_pointer->next->next;
					break;
				}
				traversal_pointer = traversal_pointer->next;
			}*/
			int key = requested_element % HASH_TABLE_SIZE;
			if (head[key]->data == requested_element) {
				Node* temp = head[key];
				head[key] = head[key]->next;
				delete temp;
			}
			else
			{
				Node* traversal_pointer;
				for(traversal_pointer=head[key];traversal_pointer->next;traversal_pointer=traversal_pointer->next)
					if (traversal_pointer->next->data == requested_element) {
						Node* temp = traversal_pointer->next;
						traversal_pointer->next = traversal_pointer->next->next;
						delete temp;
						break;
					}
			}
}
bool Is_Element_Hash_Table(int requested_element) {
	int key = requested_element % HASH_TABLE_SIZE;
	Node* traversal_pointer;
	for(traversal_pointer=head[requested_element];traversal_pointer;traversal_pointer=traversal_pointer->next)
	if (traversal_pointer->data == requested_element)
		return true;
	return false;

}

/*operatia de tipul 1: se adauga elementul x la multime (unde x este un parametru al operatiei). Daca x este deja in multime, atunci aceasta ramane neschimbata.
operatia de tipul 2: se sterge elementul x, daca acesta este deja in multime. In caz contrar, multimea ramane neschimbata.
operatia de tipul 3: returneaza 1 daca si numai daca x este in multime, iar in caz contrar returneaza 0.*/


/*Type 1 Operation:add an element 'x' to our set.If x is already in the set,then */