Cod sursa(job #2154408)

Utilizator PasarelAlex Oltean Pasarel Data 6 martie 2018 22:15:29
Problema Hashuri Scor 30
Compilator c Status done
Runda Arhiva educationala Marime 1.95 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;
    if (temp->value == val) {
        *head = (*head)->next;
        free(temp);
        return;
    }
    while (temp != NULL && temp->value != val) {
        prev = temp;
        temp = temp->next;
    }
    if (temp == 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 (hash[mod]->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 read;
    int n;
    int i;
    FILE *in;
    FILE *out;

    for (i = 0; i < PRIME; i++) {
        hash[i] = malloc(sizeof(list));
        hash[i]->value = NULL;
        hash[i]->next  = NULL;
    }

    in  = fopen("hashuri.in", "r");
    out = fopen("hashuri.out", "w");
    fscanf(in, "%d", &n);
    for (i = 0; i < n; i++) {
        fscanf(in, "%d", &read);
        if (read == 1) {
            fscanf(in, "%d", &read);
            add_hash(read);
        }
        else if (read == 2) {
            fscanf(in, "%d", &read);
            remove_hash(read);
        }
        else {
            fscanf(in, "%d", &read);
            fprintf(out, "%d\n", search(read));
        }
    }

    return 0;
}