Cod sursa(job #2153410)

Utilizator PasarelAlex Oltean Pasarel Data 6 martie 2018 10:26:07
Problema Hashuri Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.9 kb
#include <stdio.h>
#include <stdlib.h>

#define PRIME 786433

struct list {
    int value;
    struct list *next;
};

typedef struct list list;

list *hash[PRIME];

void new_node(list *head, int val) {
    list *new;
    new = malloc(sizeof(list));
    new->next  = head;
    new->value = val;
    head = new;
}

void remove_node(list *head, int val) {
    list *temp = head;
    list *prev; /*
    printf("CAUT PE %d\n", val);
    printf("INCERC SA AFISEZ PE");
    printf(" %d\n", head->value); */
    if (temp->value == val) {
        head = head->next;
        free(temp);
        return;
    }
    while (temp->value != val && temp->next != NULL) {
        prev = temp;
        temp = temp->next;
    }
    if (temp->next == NULL)
        return;
    prev->next = temp->next;
    free(temp);
}

void add_hash(int val) {
    int mod = val % PRIME;
    new_node(hash[mod], val);
}

void remove_hash(int val) {
    int mod  = val % PRIME;
    remove_node(hash[mod], val);
}

int search(int val) {
    int mod   = val % PRIME;
    list *temp = hash[mod];
    if (temp->value == val)
        return 1;
    while (temp->next != NULL && temp->next->value != val)
        temp = temp->next;
    if (temp != NULL && temp->value == val)
        return 1;
    return 0;
}

int main()
{
    int i;
    for (i = 0; i < PRIME; i++) {
        hash[i] = malloc(sizeof(list));
        hash[i]->value = NULL;
        hash[i]->next  = NULL;
    }
    int n, read;
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        scanf("%d", &read);
        if (read == 1) {
            scanf("%d", &read);
            add_hash(read);
        }
        else if (read == 2) {
            scanf("%d", &read);
            remove_hash(read);
        }
        else {
            scanf("%d", &read);
            printf("%d\n", search(read));
        }
    }

    return 0;
}