Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7

    Allocazione dinamica e puntatori a strutture dati in C: help!!

    Salve a tutti!
    Avrei bisogno di un aiuto, in quanto in teoria mi è tutto chiaro dallo studio, ma in pratica ho grosse difficoltà a scrivere correttamente alcune brevi funzioni di qualche riga di codice riguardanti gli argomenti nel titolo.

    typedef struct int_list{

    int info;
    struct int_list *next;

    } int_list;

    //Definizione della struttura hast_table - NON MODIFICARE
    typedef struct hash_table{

    //vettore di puntatori a lista di interi
    int_list **h_table;

    //dimensione del vettore di puntatori h_table
    int t_size;

    //numero di elementi contenuti nella tabella
    int n_elem;

    } hash_table;

    Questo di sopra è la parte del programma che riguarda la definizione delle strutture in input alle funzioni, queste di sotto sono le funzioni.


    /*
    Funzione di creazione ed inizializzazione di una tabella hash.

    La funzione prende in input la dimensione del vettore di puntatori della tabella da creare e restituisce
    il puntatore alla struttura hash_table allocata.

    La funzione deve:

    - Allocare la zona di memoria per la struttura hash_table
    - Allocare il vettore di puntatori a int_list della hash_table
    - Inizializzare i puntatori del vettore a NULL
    - Inizializzare t_size a size e n_elem a 0.

    */
    hash_table * create_hash_table(int size){

    hash_table* ht = (hash_table*)malloc(sizeof(hash_table));
    ht->h_table = (int_list **)malloc(sizeof(int_list *) * size);
    int i;
    for (i = 0; i < size; i++)
    ht->h_table[i]=NULL;
    ht->t_size=size;
    ht->n_elem=0;
    }

    /*
    Funzione di inserimento nella tabella hash.

    La funzione prende ininput la hash_table ed il valore intero da inserire.

    La funzione deve:

    - Allocare una zona di memoria per il nuovo elemento della lista
    - Porre il valore info dell'elemento allocato ad x
    - Inserire l'elemento IN TESTA alla lista con indice hash(x,ht)
    - Aggiornare n_elem
    */
    void insert(hash_table *ht, int x){
    int i = hash(x, ht);
    int_list *new_element = malloc(sizeof(int_list));
    new_element->info = x;
    new_element->next = ht->h_table[i];
    ht->h_table[i] = new_element;
    ht->n_elem++;

    }

    /*
    Funzione di eliminazione delle occorrenze di un valore

    La funzione prende in input la tabella hash ed il valore da eliminare

    La funzione deve:

    - Rimuovere tutti gli elementi con valore x dalla tabella. Tali elementi, se esistono, si troveranno nel bucket con indice h(x,ht)
    - Aggiornare n_elem

    Ricordarsi di deallocare la memoria degli elementi rimossi.
    */
    void delete(hash_table *ht, int x){
    int i,j;
    for (i=0; i< ht->n_elem;i++) {
    if (ht->h_table==x) {
    for (j = i +1; i < ht->n_elem; i++)
    {ht->h_table[j-1] = ht->h_table[j];}
    ht->n_elem--;
    }
    }

    /*
    Funzione di individuazione del bucket piu' pieno

    La funzione prende in input la tabella hash e ritorna l'indice del bucket che
    contiene il maggior numero di elementi.

    Nel caso in cui vi siano piu'bucket con lo stesso numero di elementi, si deve ritornare l'indice del bucket
    con indice minore tra quelli aventi il numero massimo di elementi.
    */
    int index_max_bucket(hash_table *ht){

    }

    Per l'ultima funzione purtroppo non capisco come riferirmi in linguaggio praticamente al bucket.
    Vi prego di dare un occhiata e spiegarmi gli errori che commetto e come posso porvi rimedio, grazie mille a tutti per la disponibilità.


    In allegato, inserisco il file in *.c

    Grazie a tutti di nuovo,
    ciao!

  2. #2
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Indenta il codice e usa i tag code.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    codice:
    /* Funzione di creazione ed inizializzazione di una tabella hash. La funzione prende in input la dimensione del vettore di puntatori della tabella da creare e restituisce il puntatore alla struttura hash_table allocata. La funzione deve: - Allocare la zona di memoria per la struttura hash_table - Allocare il vettore di puntatori a int_list della hash_table - Inizializzare i puntatori del vettore a NULL - Inizializzare t_size a size e n_elem a 0. */ hash_table * create_hash_table(int size){ hash_table* ht = (hash_table*)malloc(sizeof(hash_table)); ht->h_table = (int_list **)malloc(sizeof(int_list *) * size); int i; for (i = 0; i < size; i++) ht->h_table[i]=NULL; ht->t_size=size; ht->n_elem=0; } /* Funzione di inserimento nella tabella hash. La funzione prende ininput la hash_table ed il valore intero da inserire. La funzione deve: - Allocare una zona di memoria per il nuovo elemento della lista - Porre il valore info dell'elemento allocato ad x - Inserire l'elemento IN TESTA alla lista con indice hash(x,ht) - Aggiornare n_elem */ void insert(hash_table *ht, int x){ int i = hash(x, ht); int_list *new_element = malloc(sizeof(int_list)); new_element->info = x; new_element->next = ht->h_table[i]; ht->h_table[i] = new_element; ht->n_elem++; } /* Funzione di eliminazione delle occorrenze di un valore La funzione prende in input la tabella hash ed il valore da eliminare La funzione deve: - Rimuovere tutti gli elementi con valore x dalla tabella. Tali elementi, se esistono, si troveranno nel bucket con indice h(x,ht) - Aggiornare n_elem Ricordarsi di deallocare la memoria degli elementi rimossi. */ void delete(hash_table *ht, int x){ int i,j; for (i=0; i< ht->n_elem;i++) { if (ht->h_table==x) { for (j = i +1; i < ht->n_elem; i++) {ht->h_table[j-1] = ht->h_table[j];} ht->n_elem--; } } /* Funzione di individuazione del bucket piu' pieno La funzione prende in input la tabella hash e ritorna l'indice del bucket che contiene il maggior numero di elementi. Nel caso in cui vi siano piu'bucket con lo stesso numero di elementi, si deve ritornare l'indice del bucket con indice minore tra quelli aventi il numero massimo di elementi. */ int index_max_bucket(hash_table *ht){ }
    Spero di aver fatto bene, era il mio primo post.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    Immaginavo, riprovo:

    codice:
     
    
    /*
    Funzione di creazione ed inizializzazione di una tabella hash.
    
    La funzione prende in input la dimensione del vettore di puntatori della tabella da creare e restituisce
    il puntatore alla struttura hash_table allocata.
    
    La funzione deve:
    
    - Allocare la zona di memoria per la struttura hash_table
    - Allocare il vettore di puntatori a int_list della hash_table
    - Inizializzare i puntatori del vettore a NULL
    - Inizializzare t_size a size e n_elem a 0.
    
    */
    hash_table * create_hash_table(int size){
    
    hash_table* ht = (hash_table*)malloc(sizeof(hash_table));
    ht->h_table = (int_list **)malloc(sizeof(int_list *) * size);
    int i; 
    for (i = 0; i < size; i++) 
    ht->h_table[i]=NULL;
    ht->t_size=size;
    ht->n_elem=0;
    }
    
    /*
    Funzione di inserimento nella tabella hash.
    
    La funzione prende ininput la hash_table ed il valore intero da inserire.
    
    La funzione deve:
    
    - Allocare una zona di memoria per il nuovo elemento della lista
    - Porre il valore info dell'elemento allocato ad x
    - Inserire l'elemento IN TESTA alla lista con indice hash(x,ht)
    - Aggiornare n_elem 
    */
    void insert(hash_table *ht, int x){
    int i = hash(x, ht);
    int_list *new_element = malloc(sizeof(int_list));
    new_element->info = x;
    new_element->next = ht->h_table[i];
    ht->h_table[i] = new_element;
    ht->n_elem++;
    
    }
    
    /*
    Funzione di eliminazione delle occorrenze di un valore
    
    La funzione prende in input la tabella hash ed il valore da eliminare
    
    La funzione deve:
    
    - Rimuovere tutti gli elementi con valore x dalla tabella. Tali elementi, se esistono, si troveranno nel bucket con indice h(x,ht)
    - Aggiornare n_elem
    
    Ricordarsi di deallocare la memoria degli elementi rimossi.
    */
    void delete(hash_table *ht, int x){
    int i,j;
    for (i=0; i< ht->n_elem;i++) {
    if (ht->h_table==x) {
    for (j = i +1; i < ht->n_elem; i++) 
    {ht->h_table[j-1] = ht->h_table[j];}
    ht->n_elem--;
    }
    }
    
    /*
    Funzione di individuazione del bucket piu' pieno
    
    La funzione prende in input la tabella hash e ritorna l'indice del bucket che
    contiene il maggior numero di elementi. 
    
    Nel caso in cui vi siano piu'bucket con lo stesso numero di elementi, si deve ritornare l'indice del bucket 
    con indice minore tra quelli aventi il numero massimo di elementi.
    */
    int index_max_bucket(hash_table *ht){
    
    }

  5. #5
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    E' pieno di errori, prima di fare la funzione index_max_bucket devi provvedere a correggere questi errori (alcuni sono gravi, tipo quando confronti un doppio puntatore con un intero).
    Te li ho segnati:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct int_list{
        
        int info;
        struct int_list *next;
        
    } int_list;
    
    //Definizione della struttura hast_table - NON MODIFICARE
    typedef struct hash_table{
        
        //vettore di puntatori a lista di interi
        int_list **h_table;
        
        //dimensione del vettore di puntatori h_table
        int t_size;
        
        //numero di elementi contenuti nella tabella
        int n_elem;
        
    } hash_table;
    
    /*
     Funzione di creazione ed inizializzazione di una tabella hash.
     
     La funzione prende in input la dimensione del vettore di puntatori della tabella da creare e restituisce
     il puntatore alla struttura hash_table allocata.
     
     La funzione deve:
     
     - Allocare la zona di memoria per la struttura hash_table
     - Allocare il vettore di puntatori a int_list della hash_table
     - Inizializzare i puntatori del vettore a NULL
     - Inizializzare t_size a size e n_elem a 0.
     
     */
    hash_table * create_hash_table(int size){
        
        hash_table* ht = (hash_table*)malloc(sizeof(hash_table));
        ht->h_table = (int_list **)malloc(sizeof(int_list *) * size);
        int i; 
        for (i = 0; i < size; i++) 
            ht->h_table[i]=NULL;
        ht->t_size=size;
        ht->n_elem=0;
        //  non ritorni alcun valore 
    }
    
    /*
     Funzione di inserimento nella tabella hash.
     
     La funzione prende ininput la hash_table ed il valore intero da inserire.
     
     La funzione deve:
     
     - Allocare una zona di memoria per il nuovo elemento della lista
     - Porre il valore info dell'elemento allocato ad x
     - Inserire l'elemento IN TESTA alla lista con indice hash(x,ht)
     - Aggiornare n_elem 
     */
    void insert(hash_table *ht, int x){
        int i = hash(x, ht);   
        int_list *new_element = malloc(sizeof(int_list));
        new_element->info = x;
        new_element->next = ht->h_table[i];
        ht->h_table[i] = new_element;
        ht->n_elem++;
        
    }
    
    /*
     Funzione di eliminazione delle occorrenze di un valore
     
     La funzione prende in input la tabella hash ed il valore da eliminare
     
     La funzione deve:
     
     - Rimuovere tutti gli elementi con valore x dalla tabella. Tali elementi, se esistono, si troveranno nel bucket con indice h(x,ht)
     - Aggiornare n_elem
     
     Ricordarsi di deallocare la memoria degli elementi rimossi.
     */
    void delete(hash_table *ht, int x)
    {
        int i,j;
        for (i=0; i< ht->n_elem;i++) 
        {
            if (ht->h_table==x) // x + un intero, ht->h_table è di tipo int_list**, cosa vuoi fare?
            {
                for (j = i +1; i < ht->n_elem; i++) 
                {
                    ht->h_table[j-1] = ht->h_table[j];
                }
                ht->n_elem--;
            }
        }
    } // mancava la graffa
    PS: Per non stare a leggere tutto il codice, puoi dirmi in maniera breve come hai implementato la hash table?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    Ti ringrazio, degli errori me ne ero accorto, il problema è che non capisco come risolverli.
    La hash_table non l'ho implementata io, è un programma dato completo di main e altre funzioni, alcune di queste devo completarle io scrivendo il corpo secondo quando è scritto nei commenti. Il codice in *.c sei riuscito a scaricarlo? Se vuoi in privato mi dai la email che te lo invio, grazie mille per l'aiuto.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    "x + un intero, ht->h_table è di tipo int_list**, cosa vuoi fare?"

    Vorrei confrontare x con gli elementi nella tabella, se sono uguali li devo eliminare.
    Ho pensato di eliminarli spostando come in un vettore gli elementi dalla posizione i+1 alla i e poi liberare la memoria degli elementi k volte uguali a partire dall'ultimo, dove k è il numero degli elementi eliminati ossia delle volte in cui gli elementi del vettore son stati spostati a sinistra.
    Ma non ho idea di come poter deallocare la memoria relativa a tali elementi rimossi come richiesto dal commento.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    Ok, ho fatto qualche ricerca e ho capito l'errore, la funzione delete era completamente sbagliata. Ecco la correzione, che non mi genera almeno errori di compilazione:

    codice:
    void delete(hash_table *ht, int x){
    	int k = hash(x,ht);
    	int_list*p = ht -> h_table[k];   
    	int_list*q = ht -> h_table[k]; 
    	if(p == NULL) return; 
    	while(p -> info == x){ 
    	p = p -> next; 
    	ht -> h_table[k] = p; 
    	free(q); 
    	q = p; 
    	--(ht -> n_elem);
    
    }
    Se va bene, potreste dirmi come procedere con la funzione index_max_bucket?
    Non ho idea proprio di come fare, grazie mille a tutti.

    Quello che so, oltre ai commenti sul codice è:
    "Tale tabella sara' gestita con liste di trabocco, quindi ogni bucket della tabella e' un puntatore alla testa della lista contenente gli elementi che, secondo la funzione hash utilizzata, sono stati inseriti in quel bucket. Gli elementi inseriti, quindi, saranno memorizzati come elementi di una lista di interi int_list."

    Riporto anche le definizioni delle strutture int_list e hash_table.

    codice:
    //Definizione struttura lista di interi - NON MODIFICARE
    typedef struct int_list{
    
    	int info;
    	struct int_list *next;
    
    } int_list;
    
    //Definizione della struttura hast_table - NON MODIFICARE
    typedef struct hash_table{
    	
    	//vettore di puntatori a lista di interi
    	int_list **h_table;
    	
    	//dimensione del vettore di puntatori h_table
    	int t_size;
    	
    	//numero di elementi contenuti nella tabella
    	int n_elem;
    
    } hash_table;
    Grazie mille a chiunque mi aiuti, non vorrei mettervi fretta ma purtroppo ho necessità di finire il compito entro stasera, ho provato a sbatterci la testa da solo ma non ne ho ricavato nulla, quindi mi affido a voi.

    ciao a tutti

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    7
    Risolto, si può chiudere, grazie comunque.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.