Cod sursa(job #1974050)

Utilizator cazonirobertCazoni robert cazonirobert Data 26 aprilie 2017 18:04:16
Problema Hashuri Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 3.5 kb
#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;

struct Node{
    int value;
    Node  *next;
    Node  *prev;
};
struct DLL{
    Node * start;
    Node * end;
};
DLL createEmptyList(){
    DLL dll;
    dll.start = NULL;
    dll.end = NULL;
    return dll;
}
DLL createList(int a[],int n){
    Node* root, * inter, * prev, *end;
    root = new Node;
    root->prev = NULL;
    root->next = NULL;
    root->value = a[0];

    prev = root;

    for (int i=1;i<n;i++){
        inter= new Node;
        inter->value=a[i];
        inter->prev=prev;
        prev->next=inter;
        inter->next=NULL;
        prev=inter;
    }
    DLL dll;
    dll.start = root;
    dll.end = prev;
    return dll;
}

int Lenght(DLL dll){
    int l=0;
    Node* root= dll.start;
    while(root!=NULL){
        l++;
        root=root->next;
    }
    return l;

}

void Print(DLL dll){
    Node * root = dll.start;
    while (root!=NULL){
        cout<<root->value<<" ";
        root=root->next;
    }
    cout<<endl;
}
void insertAtTheEnd(DLL & dll, int x){

     Node*nn=new Node;
     nn->value=x;
     if (dll.start==NULL) {
        dll.start = nn;
        dll.end = nn;
        nn->prev=NULL;
        nn->next=NULL;
        return;
    }
     nn->prev = dll.end;
     nn->next = NULL;
     dll.end->next=nn;

     dll.end  = nn;

}

void removeElem(DLL & dll, int x){
    Node* current = dll.start;
    if (dll.start==NULL) return;
    if (dll.start==dll.end && dll.start->value==x){
        delete(dll.start);
        dll.start=NULL;
        dll.end=NULL;
        return;
    }
    while (current!=NULL){
        if (current->value==x) {
            if(dll.start == current){
                Node* next = current->next;
                dll.start = next;
                delete(current);
                next->prev = NULL;
                return;

            } else if (dll.end == current){
                Node* prev = current->prev;
                dll.end = prev;
                prev->next = NULL;
                delete(current);
                return;
            }
            Node* prev = current->prev;
            Node* next = current->next;
            delete(current);
            prev->next = next;
            next->prev = prev;
            return;
        }
        current=current->next;
    }
}

int search(DLL dll, int x){
	Node* current = dll.start;
	while (current!=NULL){
	    if (current->value==x) return 1;
	    current=current->next;
	}
	return 0;
}
///////////////

struct hashes{
    int n = 1071;
    DLL arr[1072];
};

hashes createHashes(){
    hashes hs;
    for(int i = 0; i <= hs.n; i++){
        hs.arr[i].start = NULL;
        hs.arr[i].end = NULL;
    }
    return hs;
}

void insertHash(hashes & hs, int x){
    int mod = x % hs.n;
    if(search(hs.arr[mod], x) == 0){
        insertAtTheEnd(hs.arr[mod], x);
    }
}
int searchHash(hashes & hs, int x){
    int mod = x % hs.n;
    return search(hs.arr[mod],x);
}
void removeHash(hashes &hs, int x){
    int mod = x % hs.n;
    removeElem(hs.arr[mod], x);
}
/////
    ifstream f("hashuri.in");
    ofstream g("hashuri.out");
////
int main(){ 
	hashes hs =  createHashes();
    int n;
    f >> n;
    
    int opt = -1;
    int x = -1;

    for(int i = 0; i < n; i++){
        f >> opt;
        f >> x;

        switch(opt){
            case 1:
                insertHash(hs, x);
                break;
            case 2:
                removeHash(hs, x);
                break;
            case 3:
                g << searchHash(hs, x) << endl;
        }
    }
    

    return 0;
}