Academic Year: 2022-2023 Class: Programmazione Calcolatori (Class) Created: March 12, 2023 Tag: C MOC, Python Dictionaries in C, Python Dictionaries Type: Lecture
Ricreare dizionari di python in c
def: insiemi di coppie di chiavi e di valori
Operazioni da svolgere:
- creare nuovo dizionario (vuoto)
- inserire nuovi elementi (chiavi + valore) ⇒ set
- Modifica di un valore associato ad una coppia
- Cancellazione di un elemento (input chiave)
- Lettura (input chive, output: valore)
- Ricerca( input chiave, output True o False)
oss: In Python MOC tutte tutte le operazioni sui dizionari hanno costo costante tranne la ricerca che ha costo lineare
?perché medio e non nel caso peggiore
Implementazione
Possiamo utilizzare sia un array (normale), o una lista concatenata
in entrambi i casi non sarebbe possibile avere costo costante per la maggior parte delle operazioni
Esempio utilizzando lista concatenata:
Implementazione stile python
Strutture:
struct dict_item {
char *k; //key
float v; //value
}; typedef struct dict_item dict_item;
struct node {
dict_item info; // puntatore alla coppia di valori
struct node *next; // nodo successivo
}; typedef struct node node;
struct dict {
node **a; // array di nodi
int n; // dimensione
int M; // capacità delle dizionario
}; typedef struct dict dict;
Funzioni:
Inizializzazione dizionario:
- Input: Dimensione dizionario
- Output: Puntatore al dizionario
dict dict_init(int M){ // M dimensione del dizionario
dict d;
d.a = malloc(sizeof(node*) * M);
d.n = 0;
d.M = M;
for(int i = 0; i < d.M; i++){
// inizialmente tutti gli elemnti sono uguali a NULL
d.a[i] = NULL;
}
return d;
}
- Dizionario vuoto
Funzione che modifica valore associato alla chiave o inserisce nuova coppia valore chiave in posizione 0 se non è già presente:
- Input: dizionario e puntatore alla chiave ed valore (dict_item)
- Output: void
void dict_set(dict d, dict_item e){
int p = h(d, e.k); // indice posizione della chiave nell dizionario (calcolato con la funzione hash)
node *nd;
nd = dict_search(d, e.k); // cerca il nodo con chiave k
if( nd != NULL ) { // se esiste
nd->info.v = e.v; // aggiorna il valore
} else { // se non esiste
d.a[p] = in0(d.a[p], e); // inserisci il nodo in testa alla lista
d.n ++;
}
}
- lo inseriamo in posizione iniziale perche ha il costo minore
Funzione che inserisce in un nodo lo associa a una coppia chiave valore (dict_item) :
- Input: dizionario e puntatore alla chiave ed valore (dict_item)
- Output: void
node *in0(node *nd, dict_item e){
node *p = malloc(sizeof(node)); // allochiamo memoria x l'elmento
p->info = e;
p->next = nd;
nd = p;
return nd;
}
Funzione che cerca la chiave in un dizionario e ne restituisce la posizione:
- Input: Dizionario, chiave
- Output:
- ritorna il puntate al node contenente l’item del dizionario con chiave k
- NULL se tale chiave non è presente nel dizionario
node *dict_search(dict d, char *k){
int p = h(d, k); // pos teoria dove dovrebbe essere k
// se presente nel dizioanrio
node *q = d.a[p]; // puntatore alla nodo in posizione p
// cliclo che va avanti finche non scorre tuttu i nodi
// o finche non trova una chiave identica alla chiave inserita
while( q != NULL && strcmp(k, q->info.k) != 0){
q = q->next;
}
return q; // se k non è presente dizionario q = null
// se è nel dizionario q = pointer to node contenente k
}
oss: C strcmp Funcion confronta due stringhe
:
: