PROBLEMA Dizionario in C

Cristian02

Nuovo Utente
25
2
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 

giammo82

Utente Attivo
1,210
526
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..
 
  • Mi piace
Reazioni: Cristian02

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 

bigendian

Utente Attivo
751
432
OS
Linux
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:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili