Cod sursa(job #2455447)

Utilizator Neri-kunNeri-kun Neri-kun Data 11 septembrie 2019 19:29:49
Problema Hashuri Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 4.81 kb

#include<fstream>
using namespace std;
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,int no_operations);
void Hash_Table_Pop_Element(Node** head, int requested_element, int no_operations);
bool Is_Element_Hash_Table(Node** head, int requested_element, int no_operations);
int main()
{
	int no_operations;
	int operation_choice;
	int no_requested_user;
	fin >> no_operations;
	Node** head = new Node * [no_operations];
	for (int i = 0; i < no_operations; i++)
		head[i] = NULL;
	for (int current_operation = 1; current_operation <= no_operations; current_operation++) {
		fin >> operation_choice>>no_requested_user;
		switch (operation_choice) {
		case 1:
			if(!(Is_Element_Hash_Table(head,no_requested_user,no_operations)))
			Hash_Table_Add_Element(head, no_requested_user, no_operations);
			break;
		case 2:Hash_Table_Pop_Element(head, no_requested_user, no_operations); break;
		case 3:
			if (Is_Element_Hash_Table(head, no_requested_user, no_operations))
				fout <<"1"<<endl;
			else
				fout <<"0"<<endl;
			break;
		}
	}
	return 0;
}
void Hash_Table_Add_Element(Node** head, int requested_element,int no_operations) {
	Node* temp = new Node;
	temp->data = requested_element;
	temp->next = NULL;
	if (no_operations >= requested_element) {
		if (head[no_operations % requested_element] == NULL) 
			head[no_operations % requested_element] = temp;
		else
		{
			
			temp->next = head[no_operations%requested_element];
			head[no_operations % requested_element] = temp;
		}
	}
	else
	{
		if (head[requested_element%no_operations] == NULL) 
			head[requested_element%no_operations] = temp;
		else
		{
			temp->next = head[requested_element % no_operations];
			head[requested_element % no_operations] = temp;
		}
	}
}
void Hash_Table_Pop_Element(Node** head, int requested_element, int no_operations) {
	if (no_operations >= requested_element) {
		if (head[no_operations % requested_element] == NULL)
			return;
		else {
			Node* traversal_pointer = head[no_operations % requested_element];
			if (traversal_pointer->data == requested_element && traversal_pointer->next == NULL){
				head[no_operations % requested_element] = NULL;
				return;
				}
			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;
			}
		}
	}
	else
	{
		if (head[requested_element%no_operations] == NULL)
			return;
		else {
			Node* traversal_pointer = head[requested_element%no_operations];
			if (traversal_pointer->data == requested_element && traversal_pointer->next == NULL) {
				head[requested_element%no_operations] = NULL;
				return;
			}
			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;
			}
		}
	}
}
bool Is_Element_Hash_Table(Node** head, int requested_element, int no_operations) {
	if (no_operations >= requested_element) {
		if (head[no_operations % requested_element] == NULL)
			return false;
		else {
			Node* traversal_pointer = head[no_operations % requested_element];
			while (traversal_pointer != NULL) {
				if (traversal_pointer->data == requested_element)
					return true;
				traversal_pointer = traversal_pointer->next;
			}
			return false;
		}
	}
	else
	{
		if (head[requested_element%no_operations] == NULL)
			return false;
		else {
			Node* traversal_pointer = head[requested_element%no_operations];
			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 */