Hash tables con liste di trabocco

di Anonimizzato14914 il
11 risposte
Sto preparando un esame, e mi incasino con le implementazione delle hash tables con liste di trabocco in linguaggio "C". Il prof ci ha vietato l'utilizzo degli "stack". Potreste per cortesia postare qualche esempio di codice base, molto elementare..
Grazie a tutti in anticipo.
Ciao a tutti.

11 Risposte

  • Ciao,visto che sei nuovo impiega 30 secondi del tuo tempo a leggere il regolamento del forum.

    Troverai scritto che non si forniscono esercizi da portare agli esami.
    Puoi invece confrontarti per imparare o risolvere degli errori su codice sorgente che hai scritto tu.

    Tutto chiaro?
  • Ok Grazie.
    Di seguito riporterò il codice che il mio Prof. mi ha vietato all'esame. Naturalmente farina del mio sacco ma lui non vuole gli steck.

    Questo è il codice:
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    
    typedef struct elem
    {
    char valore[15];
    struct elem* next;
    } List;
    
    typedef List stack;
    //Dichiarazione e Identificazione HashTable :: typedef stack[20];
    
    int main()
    {
    
    stack* ht[20];
    //Hashtable ht; 
    //crea il vettore
    //Questo ciclo inizializza il vettore a null
    for(int i=0;i<sizeof(ht)/sizeof(stack*);i++) {
    ht[i] = (stack*)malloc(sizeof(stack));
    char s[20];
    sprintf(s, "Valore: %d\n", i);
    strcpy(ht[i]->valore, s);
    printf(ht[i]->valore);
    }
    
    stack* htPtr = &(*ht[0]);
    printf((htPtr++)->valore);
    
    system("pause");
    return 0;
    }
    
    Ciò che chiedo a questo punto è un consiglio da un programmatore sicuramente più esperto di me.
    Dovrei semplificarlo eliminando gli stack, ho un po' di confusione per via delle diverse cose che sto preparando per questo esame.
    Spero ora vada bene. Scusatemi ancora per non aver letto le regole ed essermi precipato. Sorry
  • Nessuno puó darmi un consiglio per come migliorare quel codice?
  • Ma esattamente il testo dell'esercizio qual è ?
  • Questo è l'esercizio: scrivere un programma che legga da tastiera una sequenza di n interi distin-
    ti e li inserisca in una tabella hash di dimensione 2n posizioni utilizzando
    liste monodirezionali per risolvere eventuali con?itti.
    Utilizzare la funzione hash h(x)=((ax + b)%p)%2n dove p `e
    il numero primo 999149 e a e b sono interi positivi minori di 10.000 scelti
    casualmente.
    Una volta inseriti tutti gli interi, il programma deve stampare la lun-
    ghezza massima delle liste e il numero totale di con?itti.
    Prima di scrivere il programma chiedersi perch´e la tabella ha dimensione
    2n e non n.
  • 1)Inizia col scrivere la funzione di hash.
    2)Crea una struttura che implementi la lista semplice
    3)Crea tutte le funzioni necessarie a lavorare con la lista semplice
    4)Dichiara un vettore 2n di strutture liste semplice

    PSEUDO CODE:

    ELEMENTO:
    Dato
    Next

    (ELEMENTO) TblHash[2n]

    Hash(out intHashVal, inp Dato, inp A, int B, inp N)
    Element_New(out NewElement, inp Dato)
    Element_Add(inp NewElement, inp tblHash[], inp HashVal)
    Element_Remove(inp Element, inp tblHash[], inp HashVal)

    Avrai quindi:

    Element_Add( Element_New( Numero ) , tblHash, Hash(Numero, A, B, N) )

    Andrà a finire in:

    tblHash[Hash(Numero,A,B,N)].Dato == Numero.
  • Grazie mille vbextreme ..
    Ma la citazione fa parte della risposta?
    Cercherò di implementare il codice seguendo i tuoi suggerimenti..
  • Ciao vbextreme,
    TI ringrazio per il post molto utile.
    Vorrei solo che, se fosse possibile e poco problematico, mi postassi un codice di esempio pratico sul quale confrontare i miei progressi, come se fosse una linea guida, anche magari che rispecchi l'esercizio in base al quale mi hai dato quei preziosi consigli.
    In ogni caso Grazie.
  • Inizia a postare tu il codice,poi al massimo ti aiuto a correggerlo.
    E per favore togli quel lei che è assonante in un forum ancor piu nei miei confronti!
  • Questo è il Codice ma non va
    
    void checkAvg(int avg, struct list* head_node){ 
    struct list* prev; 
    struct list* curr; 
    struct list* next; 
    prev = head; 
    curr = prev->link; 
    next = curr->link; 
    while (curr!=NULL) { 
    if (prev->data <= avg) 
    { 
    head = curr; 
    } 
    if (curr->data <= avg) 
    { 
    prev->link = curr->link; 
    } 
    if (next->data <= avg) 
    { 
    curr->link = next->link; 
    } 
    prev = prev->link; 
    curr = curr->link; 
    next = next->link; 
    } 
    }
    
  • Segui la mia scaletta passo dopo passo,posta le varie funzioni della scaletta, il codice postato è una cosa buttata li . e basta .
Devi accedere o registrarti per scrivere nel forum
11 risposte