Corso di Algoritmi e Strutture Dati APPUNTI SUL

  • Slides: 41
Download presentation
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Liste Concatenate

Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Liste Concatenate

Tipi di dato o Struct (record) o Puntatori

Tipi di dato o Struct (record) o Puntatori

Le Liste Concatenate Una lista concatenata è una collezione lineare di strutture connesse da

Le Liste Concatenate Una lista concatenata è una collezione lineare di strutture connesse da puntatori, detti link (anelli o collegamenti), da cui il termine concatenata. Elemento

Le Liste Concatenate I nodi di una lista sono strutture ricorsive: una struttura contenente

Le Liste Concatenate I nodi di una lista sono strutture ricorsive: una struttura contenente un membro di tipo puntatore, che fa riferimento a una struttura dello stesso tipo di quella in cui è contenuto. Elemento

Le Liste Concatenate Ci saranno sue nodi particolari: un puntatore al primo elemento e

Le Liste Concatenate Ci saranno sue nodi particolari: un puntatore al primo elemento e l’ultimo nodo punterà a NULL. Elemento

Le Liste Concatenate Ci saranno sue nodi particolari: un puntatore al primo elemento e

Le Liste Concatenate Ci saranno sue nodi particolari: un puntatore al primo elemento e l’ultimo nodo punterà a NULL Elemento

Liste concatenate Operazioni fondamentali: Ø Inserimento di un nuovo nodo Ø Cancellazione di un

Liste concatenate Operazioni fondamentali: Ø Inserimento di un nuovo nodo Ø Cancellazione di un nodo esistente Ø Ricerca/Aggiornamento di un nodo esistente

Lista semplicemente concatenata Un elemento x di una lista è un oggetto con almeno

Lista semplicemente concatenata Un elemento x di una lista è un oggetto con almeno due campi info[x] campo chiave next[x] puntatore al successore dell’oggetto nella lista Una lista L è un oggetto con un campo: head[L] NIL head[L] puntatore al primo elemento x della lista Lista vuota: head[L] = NIL

Liste semplicemente concatenate in C // definizione della struttura nodo typedef struct elem{ int

Liste semplicemente concatenate in C // definizione della struttura nodo typedef struct elem{ int info; // <tipo> <valore del nodo>; struct elem* next; } elist; // definizione del puntatore ai nodi della lista typedef elist* plist;

Le Liste semplicemente Concatenate elist info plist info

Le Liste semplicemente Concatenate elist info plist info

Lista come parametro di una funzione Passare una lista come parametro significa passare il

Lista come parametro di una funzione Passare una lista come parametro significa passare il puntatore al primo nodo. l Nel caso di inserimento e cancellazione, vogliamo ottenere un side effect sulla lista dopo la chiamata della funzione

Lista come parametro di una funzione Ricordiamo che i parametri di una funzione in

Lista come parametro di una funzione Ricordiamo che i parametri di una funzione in C vengono catturati per valore <tipo> funzione(plist l) l

La funzione ritorna un puntatore come risultato plist funzione(plist l) l // nel codice

La funzione ritorna un puntatore come risultato plist funzione(plist l) l // nel codice principale … l = funzione(l);

Passiamo per riferimento il puntatore void funzione(plist* l) l // nel codice principale …

Passiamo per riferimento il puntatore void funzione(plist* l) l // nel codice principale … funzione(l);

Inserimento di un nuovo nodo: in Testa void funzione(plist* l, elemento el) l temp

Inserimento di un nuovo nodo: in Testa void funzione(plist* l, elemento el) l temp el INS-Testa(L, x) next[x] <- head[L] <- x

Inserimento di un nuovo nodo: in Testa // funzione per inserire in testa ad

Inserimento di un nuovo nodo: in Testa // funzione per inserire in testa ad una lista un nuovo nodo void inserisci. In. Testa(plist* l, int n){ plist temp = (plist)malloc(sizeof(elist)); temp->info = n; temp->next = *l; *l = temp; }

Inserimento di un nuovo nodo: in Coda void funzione(plist* l, elemento el) l temp

Inserimento di un nuovo nodo: in Coda void funzione(plist* l, elemento el) l temp el Nil

Inserimento di un nuovo nodo: in Coda NULL(L) return (head[L] = NIL) INS-Coda(L, x)

Inserimento di un nuovo nodo: in Coda NULL(L) return (head[L] = NIL) INS-Coda(L, x) if NULL(L) then head(L) <- x else y <- head(L) while next(y) ≠ NIL do y <- next(y) <- x next(x) <- NIL

Inserimento di un nuovo nodo: in Coda //funzione per inserire in coda ad una

Inserimento di un nuovo nodo: in Coda //funzione per inserire in coda ad una lista un nuovo nodo void inserisci. In. Coda(plist* l, int n){ plist temp = (plist)malloc(sizeof(elist)); temp->info = n; temp->next = NULL; if (*l == NULL) *l = temp; else { plist temp 2 = *l; while (temp 2 ->next != NULL) temp 2 = temp 2 ->next; temp 2 ->next=temp; } }

Inserimento di un nuovo nodo: in una posizione precisa void funzione(plist* l, elemento el,

Inserimento di un nuovo nodo: in una posizione precisa void funzione(plist* l, elemento el, int pos) prev cur l temp el

Inserimento di un nuovo nodo: in una posizione precisa • Scrivere prima una funzione

Inserimento di un nuovo nodo: in una posizione precisa • Scrivere prima una funzione che calcola la lunghezza della lista • Fare una casistica per valutare pos (e quindi ad esempio utilizzare gli inserimenti visti prima per la prima e l’ultima posizione) • Quindi utilizzare prev e cur per la posizione i-esima LUNG(L) x <- head(L) cont <- 0 while x ≠ NIL do x = next(x) cont <- cont + 1 return cont

Inserimento di un nuovo nodo: in una posizione precisa // funzione per calcolare il

Inserimento di un nuovo nodo: in una posizione precisa // funzione per calcolare il numero di nodi di una lista int lung. Lista(plist l){ int cont = 0; while (l != NULL) { cont++; l = l->next; } return cont; }

Inserimento di un nuovo nodo: in una posizione precisa INS-Pos(L, x, pos) if LUNG(L)

Inserimento di un nuovo nodo: in una posizione precisa INS-Pos(L, x, pos) if LUNG(L) < pos then INS-Coda(L, x) else switch pos case 0: error “posizione non valida" case 1: INS-Testa(L, x) default: prev <- head(L) cur <- next(prev) while pos > 2 do prev <- cur; cur <- next(cur) pos <- pos - 1 next(prev) <- x next(x) <- cur

Inserimento di un nuovo nodo: in una posizione precisa // funzione per inserire in

Inserimento di un nuovo nodo: in una posizione precisa // funzione per inserire in un data posizione della lista un nuovo nodo void inserisci. In. Pos(plist *l, int n, int pos) { plist prev, cur; plist temp = (plist)malloc(sizeof(elist)); temp->info = n; temp->next = NULL; int ln = lung. Lista(*l); if (ln<pos) inserisci. In. Coda(l, n); else

Inserimento di un nuovo nodo: in una posizione precisa switch (pos) { case 0:

Inserimento di un nuovo nodo: in una posizione precisa switch (pos) { case 0: printf("bisogna indicare una posizione positiva maggiore di zeron"); break; case 1: inserisci. In. Testa(l, n); break; default: prev = *l; cur = prev->next; while (pos>2) { prev = cur; cur = cur->next; pos--; } prev->next = temp; temp->next = cur; } }

Inserimento di un nuovo nodo: in una posizione precisa void funzione 2(plist* l, elemento

Inserimento di un nuovo nodo: in una posizione precisa void funzione 2(plist* l, elemento el, int pos) prev l temp el

Inserimento di un nuovo nodo: in una posizione precisa switch (pos) { case 0:

Inserimento di un nuovo nodo: in una posizione precisa switch (pos) { case 0: printf("bisogna indicare una posizione positiva maggiore di zeron"); break; case 1: inserisci. In. Testa(l, n); break; default: prev = *l; while (pos>2) { prev = prev->next; pos--; } temp->next = prev->next; prev->next = temp; } }

Cancellazione di un nodo: in Testa void funzione(plist* l) l temp CANC-Testa(L) if not

Cancellazione di un nodo: in Testa void funzione(plist* l) l temp CANC-Testa(L) if not NULL(L) then head(L) <- next(head(L)) else error “la lista è vuota”

Cancellazione di un nodo: in Testa // funzione per cancellare in una lista il

Cancellazione di un nodo: in Testa // funzione per cancellare in una lista il nodo in testa void cancella. In. Testa(plist* l){ if (*l != NULL) { plist temp = *l; *l = temp->next; free(temp); } else printf("La lista e' vuotan"); }

Cancellazione di un nodo: in Coda void funzione(plist* l) l

Cancellazione di un nodo: in Coda void funzione(plist* l) l

Cancellazione di un nodo: in Coda CANC-Coda(L) switch LUNG(L) case 0: error “la lista

Cancellazione di un nodo: in Coda CANC-Coda(L) switch LUNG(L) case 0: error “la lista è vuota” case 1: head(L) <- NIL default: prev <- head(L) cur <- next(prev) while next(cur) ≠ NIL do prev <- cur <- next(cur) next(prev) <- NIL

Cancellazione di un nodo: in Coda // funzione per cancellare in una lista il

Cancellazione di un nodo: in Coda // funzione per cancellare in una lista il nodo in coda void cancella. In. Coda(plist* l){ plist prev, cur; switch(lung. Lista(*l)) { case 0: printf("La lista e' vuotan"); break; case 1: free(*l); break; default: prev = *l; cur=prev->next; while (cur->next != NULL){ prev = cur; cur = cur->next; } free(cur); prev->next=NULL; } }

Cancellazione di un nodo: in una posizione precisa void funzione(plist* l, int pos) prev

Cancellazione di un nodo: in una posizione precisa void funzione(plist* l, int pos) prev l cur

Cancellazione di un nodo: in una posizione precisa CANC-Pos(L, pos) ln = LUNG(L) if

Cancellazione di un nodo: in una posizione precisa CANC-Pos(L, pos) ln = LUNG(L) if ln < pos error “posizione non valida” else switch pos case 0: error “posizione non valida” case 1: CANC-Testa(L) default: prev <- head(L) cur <- next(prev) while pos > 2 do prev <- cur <- next(cur) pos = pos - 1 next(prev) <- next(cur)

Cancellazione di un nodo: in una posizione precisa // funzione per cancellare inun alista

Cancellazione di un nodo: in una posizione precisa // funzione per cancellare inun alista un nodo in una data posizione void cancella. In. Pos(plist* l, int pos){ plist prev, cur; int ln = lung. Lista(*l); if (ln<pos) printf("La lunghezza della lista e' minore della posizione fornitan "); else switch(pos) { case 0: printf("Hai fornito una posizione non validan "); break; case 1: cancella. In. Testa(l); break; default: prev = *l; cur=prev->next; while (pos>2){ prev = cur; cur = cur->next; pos--; } prev->next=cur->next; free(cur); } }

Ricerca di un nodo in una lista void funzione(plist l, valore x) l x

Ricerca di un nodo in una lista void funzione(plist l, valore x) l x SEARCH(L, k) if NULL(L) then return NIL else x <- head(L) while x ≠ NIL and info(x) ≠ k do x <- NEXT(x) return x

Ricerca di un nodo in una lista // funzione per cercare in una lista

Ricerca di un nodo in una lista // funzione per cercare in una lista un nodo int cerca(plist l, int n){ int test = 0; while ((l!=NULL)&&(!test)) if (l->info == n) test = 1; else l = l->next; return test; }

Stampa dei campi chiave di una lista void stampa(plist l) l

Stampa dei campi chiave di una lista void stampa(plist l) l

Stampa dei campi chiave di una lista void stampa(plist l) { printf("( "); while

Stampa dei campi chiave di una lista void stampa(plist l) { printf("( "); while (l) { printf("["); printf("%d", l->info); printf("] "); l = l->next; } printf(")n"); }

Esercizio Data una lista L i cui nodi contengono valori interi, scrivere le seguenti

Esercizio Data una lista L i cui nodi contengono valori interi, scrivere le seguenti procedure (pseudo-codice e implementazione in C): – CANC-Val(L, x) che cancella nella lista L i nodi con valore x – CONT-Val(L, x) che conta in L quanti nodi hanno valore x – INS-Val(L, x, y) che inserisce in L un nodo con valore x dopo il nodo esistente in L con valore y (se il nodo con valore y non esiste allora sarà fatto un inserimento in coda)

Corso di Algoritmi e strutture Dati APPUNTI SUL LINGUAGGIO C Liste Concatenate FINE

Corso di Algoritmi e strutture Dati APPUNTI SUL LINGUAGGIO C Liste Concatenate FINE