Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Le strutture
Le unioni
Le liste concatenate
Allocazione dinamica
Creazione e aggiunta di un nuovo elemento alla lista
Inserimento e cancellazione di elementi
La ricerca di un elemento
C
L an
gu
ag
e
Esempio:
Esempio Supponiamo di voler memorizzare, relativamente
a ciascun abitante di un dato comune, nome e cognome,
data di nascita e codice fiscale:
Nome e cognome costituiscono un array di caratteri
La data è composta da tre numeri interi, che descrivono
giorno, mese ed anno
Il codice fiscale è un array di 16 caratteri (15 per il
codice ed uno per il carattere nullo di terminazione)
Le informazioni non possono essere collezionate in un
unico array di caratteri, perché sono disomogenee
Possibile soluzione:
soluzione memorizzare le informazioni in variabili
distinte
char name[20], fiscode[16]; Le informazioni relative ad
una persona sono sparse
short day, month, year; per la memoria
vs.vs_birth_date.vs_year
Fondamenti di Informatica I a.a. 2008-09 12
Le strutture innestate 2
Una struttura innestata viene inizializzata racchiudendo i valori
iniziali fra parentesi graffe
typedef struct
{
DATE d;
char event[20];
} CALENDAR;
struct s {
int a, b;
float c;
struct s *pointer_to_s;
};
1004
struct align_examp
{
char mem1, mem3;
short mem2;
} s1;
Poiché le strutture possono essere memorizzate in modi
diversi sui diversi calcolatori, è necessario accedervi con
modalità portabili
L’ allineamento naturale (tutti gli oggetti di 2 byte iniziano da
indirizzi pari, gli oggetti di 4 byte a indirizzi divisibili per
quattro, etc.) è il requisito più stringente imposto dai
calcolatori
Se la struttura è allineata in modo naturale è portabile
Fondamenti di Informatica I a.a. 2008-09 17
Il passaggio di strutture come
parametri di funzione 1
Esistono due modalità per passare strutture come argomenti
di funzione:
Passaggio della struttura vera e propria, per valore
Passaggio di un puntatore alla struttura, per indirizzo
VITALSTAT vs;
………
func1(vs); /* Passaggio per valore */
………
func2(&vs); /* Passaggio per indirizzo */
funcv(ar);
int *ar; /* ar è un puntatore ad intero */
funcs2(st);
struct tag *st; /* st è un puntatore a struttura */
Fondamenti di Informatica I a.a. 2008-09 21
Strutture restituite da funzioni 1
Le funzioni possono restituire strutture o puntatori a
strutture
La dichiarazione del tipo di dato restituito da una funzione
deve essere concorde con il valore effettivamente restituito
Generalmente, è preferibile restituire puntatori a strutture
per motivi di efficienza
Se si restituisce un puntatore a struttura, la struttura deve
avere durata fissa, perché altrimenti non sarebbe più
accessibile al termine della funzione
La restituzione di strutture è particolarmente utile quando si
voglia comunicare all’esterno più di un valore
struct {
int a;
float b;
} s1, s2, sf(), *ps;
………
s1 s2;
s2 sf();
ps &s1;
s2 *ps;
……… 24
Fondamenti di Informatica I a.a. 2008-09
Le unioni
include “v_stat.h”
{
printf(“insert_after: argomenti errati.\n”);
return;
}
p > next q >next;
q > next p;
} 37
Fondamenti di Informatica I a.a. 2008-09
La cancellazione di un elemento 1
Per la cancellazione di un elemento da una lista concatenata,
occorre individuare l’elemento che precede quello da eliminare
per riallacciare i puntatori della lista dopo l’eliminazione
Inoltre, è necessario utilizzare la funzione free() per rilasciare
la memoria dell’elemento eliminato
p goner p>next>next
prima
p p>next
dopo
void stampa_lista(p)
struct nodo *p;
{
while (p ! NULL)
{
printf(“%d ---> ”, p->info);
p p->next;
}
printf(“NULL\n”);
return;
}