PROBLEMA Dizionario in C

Pubblicità

Cristian02

Nuovo Utente
Messaggi
29
Reazioni
2
Punteggio
26
Buongiorno a tutti, sono uno studente universitario del corso di informatica del primo anno. Sto riscontrando alcuni problemi nell'ultima parte del programma, che riguarda i dizionari in C. A livello logico comprendo il funzionamento, ma a livello pratico ho delle difficoltà e vorrei chiedervi aiuto. Vorrei fare un semplice dizionario: come creare un dizionario vuoto(ho capito come si fa), inserire liste con i valori all'interno del dizionario, come aggiornare e inserire una nuova lista all'interno del dizionario, e infine, come posso eliminarla.

C:
//Il mio codice
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
//DIZIONARIO IN C NON è ALTRO UN ARRAY CHE ALL'INTERNO CONTIENE VARIE LISTE

//STRUTTURE
typedef struct {
    int valore;
    struct nodo *succ;
}nodo;

typedef struct{
    nodo **node;
    int dimList;     //numero di liste
    int n;            //numero di elementi nel dizionario
}dic;

typedef struct{
    char *key;
    float value;
}d_item;

//PROTOTIPO
dic dic_input(int );
void mostraDic(dic );

dic dic_input(int dimList){
    dic d;
    d.node=malloc(dimList*sizeof(nodo*));
    d.dimList=dimList;
    d.n=0;
    for (int i=0;i<dimList;i++){
        d.node[i]=NULL;
    }
return d; //restituisco il dizionario appena creato    
}

void mostraDic(dic d){
    for (int i=0;i<d.dimList;i++){
        printf("%d -\n",i);
    }
}


int main (){
    //Creo un dizionario VUOTO
    dic d;
    //Chiamo la funzione per inizializzare
    d=dic_input(3); //Sto dicendo di creare 3 liste

    mostraDic(d);
return 0;
}

il codice del prof:
C:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>


struct d_item {
    char *k;
    float v;
};
typedef struct d_item d_item;

struct nodo {
    d_item info;
    struct nodo *succ;
};
typedef struct nodo nodo;

struct dict {
    nodo **a;
    int m; // numero di liste (dimensione di a)
    int n; // numero di elementi nel dizionario
};
typedef struct dict dict;

int h(char*, dict);
dict dict_init(int);
dict dict_update(dict, d_item);
nodo *lista_cerca_k(nodo*, char*);
nodo *lista_in0(nodo*, d_item );
void dict_mostra(dict);
void lista_mostra(nodo*);


int main(int n, char *args[]){
    dict d = dict_init(3);
    int i;
    d_item e;
   
    for (i = 1; i < n; i++){
        e.k = args[i];
        e.v = i;
        d = dict_update(d, e);
    }
   
    dict_mostra(d);
}


int h(char *x, dict d){
    int out = 0;
    int i = 0;
   
    while( x[i] != '\0'){
        out = x[i]^out;
        i++;
    }
   
    return out % d.m;
}

dict dict_init(int m){
    /*
     * Ritorna un dizionario vuoto con m liste
     * */
    dict d;
    int i;
   
    d.a = malloc(m*sizeof(nodo));
    d.m = m;
    d.n = 0;
    for(i = 0; i < m; i++){
        d.a[i] = NULL;
    }
   
    return d;
}

dict dict_update(dict d, d_item e){
/*
 * Se e.k e' nel dizionario ne modifica il valore in e.v.
 * Altrimenti inserisce in d la nuova coppia e
 *
 * */
    nodo *p;
    int lis = h(e.k, d);
   
   
    p = lista_cerca_k(d.a[lis], e.k);
   
    if ( p == NULL ) { // la chiave non è nel dizionario
        /*
         * inseriamo e in d
         * */
         d.a[lis] = lista_in0(d.a[lis], e);
         d.n++;
    } else {
        /*
         * aggiorno il valore associato a e.k
         * */
        p->info.v = e.v;
    }
   
    return d;
}


nodo *lista_cerca_k(nodo *x, char *k){
    /*
     * Ritorna il puntatore al nodo contenente l'item con chiave k,
     * oppure NULL se k non e' una chiave del dizionario
     * */
    nodo *p = x;
   
    while ( p != NULL ){
        if ( strcmp(p->info.k, k) == 0 ) {
            return p;
        }
        p = p->succ;
    }
   
    return NULL;
}


nodo *lista_in0(nodo* x, d_item e){
    nodo *n = malloc(sizeof(nodo));
   
    n->info = e; // un po' delicato, perche'?
    n->succ = x;
   
    return n;
}

void dict_mostra(dict d){
    int i;
   
    for (i = 0; i < d.m; i++){
        printf("%d - ", i);
        lista_mostra(d.a[i]);
    }
}

void lista_mostra(nodo *x){
    nodo *p = x;
   
    while( p != NULL ){
        printf("(%s, %.2f) ", p->info.k, p->info.v);
        p = p->succ;
    }
    printf("\n");
}
 
Ultima modifica da un moderatore:
Si ma, quale sarebbe la difficoltà che incontri esattamente? 😅
I nomi che hai usato sono comunque un pò troppo fantasiosi, come dic_input quando si tratta dell'inizializzazione del dizionario.
 
Devi avere bene in mente come funzionano le liste concatenate in C ed ci me inserire un nodo, per aiutarti meglio nel programma diviso i compiti in funzioni, aiutati anche solo scrivendo in pseudo codice poi dividi il tutto in step..
 
Devi avere bene in mente come funzionano le liste concatenate in C ed ci me inserire un nodo, per aiutarti meglio nel programma diviso i compiti in funzioni, aiutati anche solo scrivendo in pseudo codice poi dividi il tutto in step..
No ma non capisco proprio il suo dubbio se non lo dice, considerando che ha mostrato anche il codice del prof.
 
cosa vi entrino poi le liste concatenate con un "dizionario" poi non so, forse si sbagliano gia i nomi dell'esercizio.
contento il prof contenti tutti.
 
Ultima modifica:
Pubblicità
Pubblicità
Indietro
Top