Вы находитесь на странице: 1из 35

Politecnico

di Milano

Strutture dati dinamiche


Strutture dati statiche e dinamiche

In C le dimensioni di ogni dato sono note prima


dell’esecuzione
Sarebbe utile avere contenitori la cui dimensione
varia a seconda delle necessità
La soluzione in C:
Ogni variabile ha sempre una dimensione prefissata…
Ma … durante l’esecuzione di un programma è possibile
creare dinamicamente nuove variabili
I meccanismi di allocazione e
cancellazione dinamica della memoria

Vengono offerti da due funzioni di libreria


malloc e free

#include <stdlib.h> /* necessario per usare malloc e free */


#include <stdio.h>
typedef int *tipoPtr;
void main()
{ Restituisce la dimensione in byte di una variabile
o di elementi di un certo tipo
tipoPtr p;
p = malloc(sizeof(int)); /*crea una variab. anonima int */
*p = 24;
printf(“%d”, *p);
free(p); /* libera lo spazio di memoria a cui p punta */
}
Modello di esecuzione (1)

Ad ogni programma in esecuzione vengono associate


due aree di memoria con caratteristiche diverse
Lo stack
Contiene le aree di memoria associate alle variabili
“normali” organizzate nei rispettivi record di
attivazione
Viene gestito con politica LIFO
Lo heap (mucchio)
Contiene le aree di memoria associate alle variabili
allocate dinamicamente
Modello di esecuzione (2)

#include <stdlib.h>
#include <stdio.h>
typedef int *tipoPtr;
void main()
{
tipoPtr p;
p = malloc(sizeof(int));
*p = 24;
printf(“%d”, *p); p
free(p);
}

stack heap
Modello di esecuzione (2)

#include <stdlib.h>
#include <stdio.h>
typedef int *tipoPtr;
void main()
{
tipoPtr p;
p = malloc(sizeof(int));
*p = 24;
printf(“%d”, *p); p
free(p);
}

stack heap
Modello di esecuzione (2)

#include <stdlib.h>
#include <stdio.h>
typedef int *tipoPtr;
void main()
{
tipoPtr p;
p = malloc(sizeof(int));
*p = 24;
printf(“%d”, *p); p
free(p);
} 24

stack heap
Modello di esecuzione (2)

#include <stdlib.h>
#include <stdio.h>
typedef int *tipoPtr;
void main()
{
tipoPtr p;
p = malloc(sizeof(int));
*p = 24;
printf(“%d”, *p); p
free(p);
} 24

stack heap
Aspetti critici

Dangling pointer
p = malloc(sizeof(int));
free(p);
*p = 12;
Il valore 12 viene assegnato ad un’area di memoria non più
associata alla variabile anonima creata con la malloc!
Garbage
La memoria allocata dinamicamente rimane nello heap
durante tutta l’esecuzione del programma a meno che non
si deallochi esplicitamente
Esempio di programma che spreca memoria
p = malloc(sizeof(int));
*p = 24;
p = malloc(sizeof(int));
*p = 10;
Vengono create due aree di memoria dello heap, ma solo la
seconda sarà raggiungibile tramite p. La seconda
costituisce spazzatura (garbage)
Liste a puntatori (1)

Sono costruite collegando elementi costituiti da due


parti:
Il contenuto informativo
un intero, i dati di uno studente, un numero complesso,
una stringa, ….
Un puntatore all’elemento seguente
Ciascun elemento viene creato con l’allocazione
dinamica della memoria

ptr “Trovare” “topi“ “è” “difficile”

stack heap
Liste a puntatori (2)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Cancellazione
ptr “Trovare” “topi“ “è” “difficile”
prec
corr
Liste a puntatori (2)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Cancellazione
ptr “Trovare” “topi“ “è” “difficile”
prec
corr
Liste a puntatori (2)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Cancellazione
ptr “Trovare” “topi“ “difficile”
prec
corr
Liste a puntatori (3)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Inserimento

ptr “Trovare” “topi“ “è” “difficile”


corr
new
“molto”
Liste a puntatori (3)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Inserimento

ptr “Trovare” “topi“ “è” “difficile”


corr
new
“molto”
Liste a puntatori (3)

Vantaggi
E` possibile aggiungere o eliminare elementi al
bisogno ed in modo semplice
Inserimento

ptr “Trovare” “topi“ “è” “difficile”


corr
new
“molto”
Tipi necessari per costruire la lista

typedef struct {
int a;
int b;
} TipoDato; /* TipoDato può avere qualsiasi struttura */

typedef struct El {
TipoDato info; /*si assume che tipoDato sia stato definito
precedentemente */
struct El *next; /* puntatore all’elemento seguente */
} ElemLista;
typedef ElemLista *Lista;

typedef enum {false, true} boolean; /* usato dopo */


Operazioni fondamentali per la
gestione delle liste

/* creazione di una lista vuota */


Lista crea();

/* inserimento di un elemento nella lista */


void inserisciInTesta(Lista *l, TipoDato dato);
void inserisciInCoda(Lista *l, TipoDato dato);
void inserisciInOrdine(Lista *l, TipoDato dato);

/* controllo lista vuota */


boolean listaVuota(Lista l);

/* controllo esistenza di un elemento nella lista */


boolean esiste(Lista l, TipoDato dato);
Operazioni fondamentali per la
gestione delle liste

/* cancellazione di un elemento dalla lista */


void cancella(Lista *l, TipoDato dato);

/* restituisce la sottolista costituita da tutti gli


elementi di quella di partenza ad esclusione del
primo */
Lista coda(Lista l);

/* stampa sullo schermo il contenuto della lista */


void stampaLista(Lista l);
Operazioni di servizio relative a
TipoDato
TipoDato acquisisci()
{
TipoDato x;
scanf(“%d%d”, &(x.a), &(x.b));
return x;
}

boolean uguale(TipoDato d1, TipoDato d2)


{
if((d1.a == d2.a)&&(d1.b == d2.b)) return true;
else return false;
}

void stampa(TipoDato d)
{ printf(“%d, %d\n”, d.a, d.b); }
Un main di esempio
void main()
{
int i;
Lista lista, lista1;
TipoDato d;

lista = crea();
for(i=0;i<5;i++)
{
d = acquisisci();
inserisciInTesta(&lista, d);
stampaLista(lista);
}
d = acquisisci();
if(esiste(lista, d) == vero)
cancella(&lista, d);
stampaLista(lista);
lista1 = coda(lista);
stampaLista(lista1);
}
Implementazione di crea ed esiste

Lista crea() { return NULL; }

boolean esiste(Lista l, TipoDato dato)


{
while((l!=NULL) && uguale(l->info,dato)==false)
l = l->next;
if(l!=NULL) return true;
else return false;
} i
lista
lista1 Attivazione main
1
d info
2
l 3 0 2 4 1 2 7 9
dato 1
2
Attivazione esiste
Implementazione di crea ed esiste

Lista crea() { return NULL; }

boolean esiste(Lista l, TipoDato dato)


{
while((l!=NULL) && uguale(l->info,dato)==false)
l = l->next;
if(l!=NULL) return true;
else return false;
} i
lista
lista1 Attivazione main
1
d info
2
l 3 0 2 4 1 2 7 9
dato 1
2
Attivazione esiste
Implementazione di crea ed esiste

Lista crea() { return NULL; }

boolean esiste(Lista l, TipoDato dato)


{
while((l!=NULL) && uguale(l->info,dato)==false)
l = l->next;
if(l!=NULL) return true;
else return false;
} i
lista
lista1 Attivazione main
1
d info
2
l 3 0 2 4 1 2 7 9
dato 1
2
Attivazione esiste
Implementazione di inserisciInTesta

void inserisciInTesta(Lista *l, TipoDato dato)


{
Lista temp;
temp = malloc (sizeof(ElemLista));
temp->info = dato;
temp->next = *l;
*l = temp;
}
lista
6 info
d
7
l 3 0 2 4 1 2 7 9

dato 6
7
temp
Implementazione di inserisciInTesta

void inserisciInTesta(Lista *l, TipoDato dato)


{
Lista temp;
temp = malloc (sizeof(ElemLista));
temp->info = dato;
temp->next = *l;
*l = temp;
}
lista
6 info
d
7
l 3 0 2 4 1 2 7 9

dato 6
7
6 7
temp
Implementazione di inserisciInTesta

void inserisciInTesta(Lista *l, TipoDato dato)


{
Lista temp;
temp = malloc (sizeof(ElemLista));
temp->info = dato;
temp->next = *l;
*l = temp;
}
lista
6 info
d
7
l 3 0 2 4 1 2 7 9

dato 6
7
6 7
temp
Implementazione di inserisciInTesta

void inserisciInTesta(Lista *l, TipoDato dato)


{
Lista temp;
temp = malloc (sizeof(ElemLista));
temp->info = dato;
temp->next = *l;
*l = temp;
}
lista
6 info
d
7
l 3 0 2 4 1 2 7 9

dato 6
7
6 7
temp
Implementazione di cancella

void cancella(Lista *l, TipoDato dato)


{
Lista temp, prec;
temp = *l;
prec = NULL;
while(temp!=NULL&&
uguale(temp->info, dato)==false) {
prec = temp;
temp = temp->next;
} lista
if (temp!=NULL && prec!=NULL) 1
{ d 3 0 2 4
2
prec->next = temp->next;
l
free(temp);
} dato 1
else if(prec == NULL) 2 1 2 7 9
{ temp
*l=temp->next; prec
free(temp);
}}
Implementazione di cancella

void cancella(Lista *l, TipoDato dato)


{
Lista temp, prec;
temp = *l;
prec = NULL;
while(temp!=NULL&&
uguale(temp->info, dato)==false) {
prec = temp;
temp = temp->next;
}
if (temp!=NULL && prec!=NULL)
{ lista
prec->next = temp->next; 1
free(temp); d 3 0 2 4
2
} l
else if(prec == NULL)
{ dato 1
*l=temp->next; 2 1 2 7 9
free(temp); temp
}} prec
Implementazione di cancella

void cancella(Lista *l, TipoDato dato)


{
Lista temp, prec;
temp = *l;
prec = NULL;
while(temp!=NULL&&
uguale(temp->info, dato)==false) {
prec = temp;
temp = temp->next;
}
if (temp!=NULL && prec!=NULL)
{ lista
prec->next = temp->next; 1
free(temp); d 3 0 2 4
2
} l
else if(prec == NULL)
{ dato 1
*l=temp->next; 2 1 2 7 9
free(temp); temp
}} prec
Implementazione di cancella

void cancella(Lista *l, TipoDato dato)


{
Lista temp, prec;
temp = *l;
prec = NULL;
while(temp!=NULL&&
uguale(temp->info, dato)==false) {
prec = temp;
temp = temp->next;
}
if (temp!=NULL && prec!=NULL)
{ lista
prec->next = temp->next; 1
free(temp); d 3 0 2 4
2
} l
else if(prec == NULL)
{ dato 1
*l=temp->next; 2 1 2 7 9
free(temp); temp
}} prec
Implementazione di cancella

void cancella(Lista *l, TipoDato dato)


{
Lista temp, prec;
temp = *l;
prec = NULL;
while(temp!=NULL&&
uguale(temp->info, dato)==false) {
prec = temp;
temp = temp->next;
}
if (temp!=NULL && prec!=NULL)
{ lista
prec->next = temp->next; 1
free(temp); d 3 0 2 4
2
} l
else if(prec == NULL)
{ dato 1
*l=temp->next; 2 7 9
free(temp); temp
}} prec
Cancella ricorsiva (1)

Algoritmo
Se la lista è vuota non è necessario svolgere alcuna
operazione
Se il primo elemento della lista è quello cercato, lo si
elimina (*l=temp->next; free(temp);)
Altrimenti si richiama la cancella sulla sottolista che
segue il primo elemento
Cancella ricorsiva (2)

void cancRic(Lista *l, TipoDato dato)


{

Lista temp;

temp = *l;
if(temp!=NULL)
if(uguale(temp->info, dato)==true)
{
*l=temp->next;
free(temp);
}
else cancRic(&(temp->next), dato);
}

Вам также может понравиться

  • Didattica Del Disegno
    Didattica Del Disegno
    Документ1 046 страниц
    Didattica Del Disegno
    Riccardo Ricci
    100% (2)
  • Elementi Di Statistica
    Elementi Di Statistica
    Документ76 страниц
    Elementi Di Statistica
    Riccardo Ricci
    Оценок пока нет
  • (Ebook - PDF - Ita) Java Mattone Dopo Mattone
    (Ebook - PDF - Ita) Java Mattone Dopo Mattone
    Документ231 страница
    (Ebook - PDF - Ita) Java Mattone Dopo Mattone
    nakum
    100% (4)
  • Elementi Fondamentali Di Statistica Descrittiva
    Elementi Fondamentali Di Statistica Descrittiva
    Документ11 страниц
    Elementi Fondamentali Di Statistica Descrittiva
    Riccardo Ricci
    Оценок пока нет
  • Percorso Di Disegno Tecnico Industriale
    Percorso Di Disegno Tecnico Industriale
    Документ60 страниц
    Percorso Di Disegno Tecnico Industriale
    Riccardo Ricci
    Оценок пока нет
  • 24 Ricorsione
    24 Ricorsione
    Документ28 страниц
    24 Ricorsione
    openid_9xLqqfRO
    Оценок пока нет
  • 22 VarArgs
    22 VarArgs
    Документ3 страницы
    22 VarArgs
    openid_9xLqqfRO
    Оценок пока нет
  • Manuale Di Rilievo e Documentazione Grafica
    Manuale Di Rilievo e Documentazione Grafica
    Документ264 страницы
    Manuale Di Rilievo e Documentazione Grafica
    Riccardo Ricci
    Оценок пока нет
  • Dispense Di Statistica
    Dispense Di Statistica
    Документ49 страниц
    Dispense Di Statistica
    Riccardo Ricci
    Оценок пока нет
  • Introduzione A SolidWorks
    Introduzione A SolidWorks
    Документ316 страниц
    Introduzione A SolidWorks
    Riccardo Ricci
    Оценок пока нет
  • 25 AlberiBin
    25 AlberiBin
    Документ5 страниц
    25 AlberiBin
    openid_9xLqqfRO
    Оценок пока нет
  • 26 Adt
    26 Adt
    Документ8 страниц
    26 Adt
    openid_9xLqqfRO
    Оценок пока нет
  • 21 LongJmp
    21 LongJmp
    Документ3 страницы
    21 LongJmp
    Riccardo Ricci
    Оценок пока нет
  • 23 Liste
    23 Liste
    Документ10 страниц
    23 Liste
    openid_9xLqqfRO
    Оценок пока нет
  • 18 DynAlloc
    18 DynAlloc
    Документ8 страниц
    18 DynAlloc
    Riccardo Ricci
    Оценок пока нет
  • 19 FunctPoint
    19 FunctPoint
    Документ7 страниц
    19 FunctPoint
    openid_9xLqqfRO
    Оценок пока нет
  • 17 Macro
    17 Macro
    Документ6 страниц
    17 Macro
    openid_9xLqqfRO
    Оценок пока нет
  • 20 Complementi 2
    20 Complementi 2
    Документ6 страниц
    20 Complementi 2
    openid_9xLqqfRO
    Оценок пока нет
  • 16 FileRandom
    16 FileRandom
    Документ5 страниц
    16 FileRandom
    openid_9xLqqfRO
    Оценок пока нет
  • 15 Struct
    15 Struct
    Документ10 страниц
    15 Struct
    openid_9xLqqfRO
    Оценок пока нет
  • 11 File
    11 File
    Документ17 страниц
    11 File
    openid_9xLqqfRO
    Оценок пока нет
  • 14 Funzioni
    14 Funzioni
    Документ21 страница
    14 Funzioni
    openid_9xLqqfRO
    Оценок пока нет
  • 08 VettMat
    08 VettMat
    Документ9 страниц
    08 VettMat
    Alessio Barile
    Оценок пока нет
  • Puntatori - PoliTo
    Puntatori - PoliTo
    Документ14 страниц
    Puntatori - PoliTo
    Flavia Isernia
    Оценок пока нет
  • 10 Complementi 1
    10 Complementi 1
    Документ10 страниц
    10 Complementi 1
    openid_9xLqqfRO
    Оценок пока нет
  • 05 Espressioni
    05 Espressioni
    Документ10 страниц
    05 Espressioni
    openid_9xLqqfRO
    Оценок пока нет
  • 12-Algoritmi Ordinamento
    12-Algoritmi Ordinamento
    Документ9 страниц
    12-Algoritmi Ordinamento
    Francesco Cds Caruso
    Оценок пока нет
  • 09 Stringhe
    09 Stringhe
    Документ14 страниц
    09 Stringhe
    openid_9xLqqfRO
    Оценок пока нет
  • 07 Cicli
    07 Cicli
    Документ12 страниц
    07 Cicli
    openid_9xLqqfRO
    Оценок пока нет
  • 06 Selezione
    06 Selezione
    Документ9 страниц
    06 Selezione
    openid_9xLqqfRO
    Оценок пока нет