Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Array puntatori, Pila, Coda, Liste linkate, Slide di Elementi di Informatica

Questa lezione introduttiva alle strutture dati complesse presenta esempi e spiegazioni su array di puntatori, pile (stack), coda (queue), liste semplici e doppiamente linkate. Il documento include anche codice c per illustrare l'implementazione di pile e coda utilizzando array.

Tipologia: Slide

2012/2013

Caricato il 23/11/2013

spike.ricciolino1
spike.ricciolino1 🇮🇹

3 documenti

1 / 10

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Fondamenti di Informatica
21. Strutture di dati complesse in C++
21. Strutture di dati complesse in C++
Corso di Laurea in Ingegneria Informatica e dell’Automazione
A.A. 2012-2013
Semestre
Prof. Giovanni Pascoschi
Strutture dati complesse
Esempi di strutture dati complesse analizzate in questa lezione:
Array di puntatori
Pila (Stack)
Coda (queue)
Liste semplici (semplicemente linkate)
Liste doppie (doppiamente linkate)
Fondamenti di Informatica A.A. 2012-2013 a cura di Pascoschi Giovanni 2
Array di puntatori
L’istruzione :
tipo* array[dim];
dichiara un array di puntatori, dove:
Il nome dell'array è
array
Il nome dell'array è
array
L'array ha dim elementi
Gli elementi array[0], array[1], ...sono puntatori a dati di tipo tipo
La memoria per i singoli dati deve essere allocata esplicitamente
Gli array di puntatori permettono di ridurre la quantità di memoria allocata
al minimo indispensaile
Fondamenti di Informatica A.A. 2012-2013 a cura di Pascoschi Giovanni 3
Esempio di array di puntatori
char* strin[4];
strin[0] 0xAB00
strin[1] 0xB392
strin[2] 0xAC84
m a r i o \0
a \0
p i n o \0
0xAB00
0xB392
0xAC84
0xB0F0
L’occupazione in memoria è al minimo indispensabile, al contrario della
dichiarazione statica di 4 array di dimensione fissa.
strin[3] 0xB0F0 a n g e l a \0
0xB0F0
Fondamenti di Informatica A.A. 2012-2013 a cura di Pascoschi Giovanni 4
pf3
pf4
pf5
pf8
pf9
pfa

Anteprima parziale del testo

Scarica Array puntatori, Pila, Coda, Liste linkate e più Slide in PDF di Elementi di Informatica solo su Docsity!

Fondamenti di Informatica

21. Strutture di dati complesse in C++21. Strutture di dati complesse in C++

Corso di Laurea in Ingegneria Informatica e dell’AutomazioneA.A. 2012-20132° SemestreProf. Giovanni Pascoschi

Strutture dati complesse 

Esempi di strutture dati complesse analizzate in questa lezione:

Array di puntatori

Pila (Stack)

Coda (queue)

Liste semplici (semplicemente linkate)

Liste doppie (doppiamente linkate)

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Array di puntatori

L’istruzione : tipo* array[dim]; dichiara un array di puntatori, dove:

Il nome dell'array è

array

Il nome dell'array è

array

L'array ha

dim

elementi

Gli elementi

array

[0],

array

[1], ...sono puntatori a dati di tipo

tipo

La memoria per i singoli dati deve essere allocata esplicitamente

Gli array di puntatori permettono di ridurre la quantità di memoria allocataal minimo indispensaile

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

3

Esempio di array di puntatori

char* strin[4];

strin[0]

0xAB

strin[1]

0xB

strin[2]

0xAC

m

a

r^

i^

o

\

a

\

p

i^

n

o

\

0xAB

0xB

0xAC 0xB0F

L’occupazione

in

memoria

è

al

minimo

indispensabile,

al

contrario

della

dichiarazione statica di 4 array di dimensione fissa.

strin[3]

0xB0F

a

n

g

e

l^

a

\

0xB0F

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio di array di puntatori^ Esempio:Array di 4 stringhe di lunghezza variabile tra 1 e 20 caratteri^ 

Se allocato

staticamente

Ogni elemento deve essere di 21 byte per poter contenere la stringa didimensione massima ( 20 caratteri più il terminatore) In totale sono necessari 4 x 21 = 84 bytesIn totale sono necessari 4 x 21 = 84 bytes 

Se allocato

dinamicamente

Ogni elemento è un puntatore e occupa 4 byteÈ allocata la memoria necessaria a contenere esattamente le singolestringhe

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

5

Esempio di array di puntatori^ Se tutte le stringhe sono lunghe 8 caratteri

ogni stringa occupa 9 byte

Array statico Dimensione totale: 4 x 21 = 84Dimensione dati: 4 x 9 = 36Efficienza: 36 / 84 =

Array dinamico Dimensione totale: 4 x 4 + 4 x 9 = 52Dimensione dati: 4 x 9 = 36Efficienza: 36 / 52 =

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Pila (Stack) con array 

la Pila (Stack) è un insieme di dati che permette l’inserimento di nuovielementi e l’estrazione degli elementi introdotti da un’unica estremità

il funzionamento della pila viene denominato

LIFO

L

ast

I

nput

F

irst

O

utput)

meccanismo utilizzato per gestire le chiamate alle funzioni (insieme degliindirizzi di rientro) oppure nel registro di stack (linguaggio assembly)

operazione di inserimento di un dato

push

operazione di estrazione di un dato

pop

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

7

Pila (Stack) con array 

L’implementazione

di

una

pila

puo’

essere

fatta

tramite

un

array

(dimensione fissa)

A[0]

push

pop

testa = 0

A[1] A[2] .......
A[MAX-1]

testa = MAX

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Coda (Queue) con array 

L’implementazione

di

una

coda

puo’

essere

fatta

tramite

un

array

(dimensione fissa)

A[0]
A[1]
A[MAX-1]

push

pop

fine = MAX-

fine = -

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

13

Esempio Coda

#include using namespace std;const int MAX = 20;int Coda[MAX];int fine;void clearCoda( );void pop( ); void

push(

do {

menu( );cout<<“Seleziona una voce”;cin>>scelta;} while(scelta <1 || scelta >5); switch(scelta) {case 1:

clearCoda( );break;

case

void

push(

void readCoda( );void menu( );int main( ){

int scelta;clearCoda( );do {

case

pop( );break;

case 3:

push( );break;

case 4:

readCoda( );break;

}while(scelta !=5);return 0; }

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio Coda^ void pop( ) {

if( fine ==-1)

cout<<“La coda e’ vuota. Impossibile estrarre un dato”<< endl; else{

cout << “Elemento estratto = “ << Coda[0] << endl;for(int i=1; i<= fine; i++) Coda[i-1] = Coda[i];fine- -; } }} void push( ) {

int dato;if (fine == MAX-1)

cout<<“La coda è piena. Impossibile inserire altri dati”<< endl; else{

cout << “dato da inserire = “;cin>> dato;fine++;Coda[fine] = dato; } }

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

15

Esempio Coda

void clearCoda( ) {

fine = -1;cout<< “Coda vuota” << endl; } void readCoda( ) {

for(int i=0; i<= fine; i++) {cout<< Coda[i] << endl; }} } void menu( ) {

cout << endl;cout << “1. Pulisci coda” << endl;cout << “2. Estrai un dato” << endl;cout << “3. Aggiungi un dato” << endl;cout << “4. Leggi coda” << endl;cout << “5. Fine” << endl; }^ Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Liste semplici (semplicemente linkate)

Una lista semplice e’ costituita da

nodi

Ogni nodo e’ una struttura che contiene :

Dati

Un riferimento (puntatore) al nodo successivo

Riferimenti esterni

Riferimenti esterni

Puntatore al primo elemento della lista:

head

Un riferimento speciale indica la fine della lista:

Puntatore a

NULL

Puntatore al nodo stesso

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

17

Liste semplici

Struttura logica di una lista semplice

Il terminatore è un puntatore a NULL head

NULL

Il terminatore è un puntatore all'elemento stesso

head In una lista circolare il terminatore punta al primo elemento della lista^ head^ Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio lista semplice

0xBA

0xBB

NULL

0xBA

NULL

head

0xBA

0xBA

0xBB

struct node {

int data;node* next;

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

19

Esempio lista semplice

Una lista semplice può essere percorsa solo in avanti, cioè dalla testa verso la coda

Per scorrere una lista è necessaria una variabile temporanea per puntare ad ungenerico elemento

Non si può usare il puntatore alla testa

head

altrimenti si perde il riferimento al primo

elemento

curr

puntatore corrente

head

puntatore alla testa della lista

curr = head;

// curr punta alla testa della lista

curr = curr->next;

// curr punta al prossimo nodo della lista

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio Lista semplice

void InsertList( ) {

string Nomeins;Node*

nuovo; // puntatore del nuovo nodo

Node*

curr;

// puntatore temporaneo

Node*

prec;

// puntatore al nodo precedente

cout<< “Nominativo da inserire”;

//info nuovo nodo

cin>> Nomeins; nuovo = new Node;nuovo = new Node; nuovo-> nome = Nomeins;nuovo->next = NULL; if(IsEmptyList()==true) head = nuovo; // se lista vuota nuovo = nuova testaelse {

if(head->nome >= nuovo->nome) {

//nuovo nodo precede testa in ord. alf?

curr = head;

// la testa diventa il nodo curr

head = nuovo;

// il nuovo nodo diventa la testa

head->next = curr;

//il puntatore al next di testa è curr

return; }

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

25

Esempio Lista semplice

else {

curr = head;

//nodo fluttuante temporaneo

while(curr != NULL && nuovo->nome>=curr->nome) { // si scorre la lista fino alla fine

prec = curr;

// il nodo temporaneo diventa il nodo precedente

curr = curr->next;

// il puntatore al successivo viene assegnato a temp

} nuovo->next = curr;

// si è trovato il nodo che segue il nodo nuovo

prec->next = nuovo; }}

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio Lista semplice

void RemoveList( ) {

string Nomeins;Node*

curr;

// puntatore temporaneo

Node*

prec;

// puntatore al nodo precedente

bool trovato = false; cout<< “Nominativo da rimuovere”;cin>> Nomeins; if(IsEmptyList()==true) cout<<“La lista è già vuota”<<endl; // lista vuotaelse {

if(head->nome == Nomeins) {

//nome = nome inserito?

trovato = true;

// la testa diventa il nodo curr

curr = head->next;

// il nuovo nodo diventa la testa : si salva head

next

cout<<“Nome eliminato: “<< head->nome <<endl;delete head;head= curr;

// nuova testa è l’elemento successivo

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

27

Esempio Lista semplice

else {

curr = head->next; //nodo fluttuante temporaneoprec = head; while( !trovato && curr != NULL)

// si scorre la lista fino alla fine

if(curr->nome == Nomeins) {

trovato = true;prec->next = curr->next;

// il nodo curr viene bypassato

cout<< “Nome eliminato :”<< curr->nome << endl; delete curr;delete curr; } else {

prec = curr;

// curr diventa il nodo precedente

curr = curr->next;

// curr->next diventa in nuovo curr

} if(! trovato) cout<<“Nome non trovato nella lista”<<endl;; }

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Lista doppiamente linkata

Una lista doppiamente linkata e’ costituita da nodi

Ogni nodo e’ una struttura che contiene

Dati

Un riferimento (puntatore) al nodo successivo

Un riferimento (puntatore) al nodo precedente

Riferimenti esterni

Puntatore al primo elemento della lista:

head

Puntatore al primo elemento della lista in senso opposto:

tail

Un riferimento speciale indica la fine della lista in maniera analoga alle liste semplici

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

29

Liste doppiamente linkate

Struttura logica di una lista doppiamente linkataI terminatori sono due puntatori a NULL

head

NULL

I terminatori sono due puntatori all’elemento stesso

tail

NULL

In una lista circolare i terminatori puntano al capo opposto della lista

head

tail

head

tail

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Esempio lista doppiamenta linkata

Struttura logica di una lista doppiamente linkata non circolare e i terminatori puntatori aNULL

0xBAF

head0xBA

0xBB

NULL

0xBA

0xBAF

0xBB

struct node {

int data;struct node* next;struct node* prev;

0xBB

tail

345 NULL

0xBA

0xBAF

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

31

Esempio lista doppiamenta linkata

Una lista doppia può essere percorsa in due versi:

In avanti, cioè dalla testa verso la coda

Indietro, cioè dalla coda verso la testa

È necessaria una variabile temporanea

curr

per puntare ad un generico elemento

curr = head;curr = curr->next;

// per scorrere in avanti la lista

curr = tail;curr = curr->prev;

// per scorrere all’indietro la lista

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

Riepilogo della lezione

Strutture di dati complesse

Array di puntatori

Pila

Coda

Liste linkate semplici

Liste doppiamente linkate

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni

37

Fine della lezione



Domande?

Fondamenti di Informatica A.A. 2012-

a cura di Pascoschi Giovanni