Cod sursa(job #2455591)

Utilizator Neri-kunNeri-kun Neri-kun Data 11 septembrie 2019 23:44:20
Problema Hashuri Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.84 kb

#include<fstream>
using namespace std;
#define HASH_TABLE_SIZE 500009
ifstream fin("hashuri.in");
ofstream fout("hashuri.out");
typedef struct Node {
	int data;
	struct Node* next;
}Node;
void Hash_Table_Add_Element(Node** head, int requested_element);
void Hash_Table_Pop_Element(Node** head, int requested_element);
bool Is_Element_Hash_Table(Node** head, int requested_element);

int main()
{
	int no_operations;
	int operation_choice;
	int no_requested_user;

	Node** head = new Node * [HASH_TABLE_SIZE];
	for (int i = 0; i < HASH_TABLE_SIZE; i++)
		head[i] = NULL;
	for (fin >> no_operations;no_operations;no_operations--) {
		fin >> operation_choice>>no_requested_user;
		switch (operation_choice) {
		case 1:
			if (!(Is_Element_Hash_Table(head, no_requested_user)))
			Hash_Table_Add_Element(head, no_requested_user);
			break;
		case 2:Hash_Table_Pop_Element(head, no_requested_user); break;
		case 3:
			if (Is_Element_Hash_Table(head, no_requested_user))
				fout <<"1"<<endl;
			else
				fout <<"0"<<endl;
			break;
		}
	}
	return 0;
}
void Hash_Table_Add_Element(Node** head, int requested_element) {
	Node* temp = new Node;
	temp->data = requested_element;
	temp->next = NULL;
		if (head[requested_element%HASH_TABLE_SIZE] == NULL) 
			head[requested_element%HASH_TABLE_SIZE] = temp;
		else
		{
			
			temp->next = head[requested_element%HASH_TABLE_SIZE];
			head[requested_element%HASH_TABLE_SIZE] = temp;
		}
}
void Hash_Table_Pop_Element(Node** head, int requested_element) {

		if (head[requested_element%HASH_TABLE_SIZE] == NULL)
			return;
		else {
			/*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;
			}*/
			if (head[requested_element % HASH_TABLE_SIZE]->data == requested_element)
				head[requested_element % HASH_TABLE_SIZE] = head[requested_element % HASH_TABLE_SIZE]->next;
			else
			{
				Node* traversal_pointer = head[requested_element % HASH_TABLE_SIZE];
				while (traversal_pointer->next->data != requested_element && traversal_pointer->next != NULL)
					traversal_pointer = traversal_pointer->next;
				if (traversal_pointer->next != NULL)
					traversal_pointer = traversal_pointer->next->next;
			}
		}
}
bool Is_Element_Hash_Table(Node** head, int requested_element) {
		if (head[requested_element%HASH_TABLE_SIZE] == NULL)
			return false;
		else {
			Node* traversal_pointer = head[requested_element%HASH_TABLE_SIZE];
			while (traversal_pointer != NULL) {
				if (traversal_pointer->data == requested_element)
					return true;
				traversal_pointer = traversal_pointer->next;
			}
			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 */