La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

APPUNTI SUL LINGUAGGIO C

Presentazioni simili


Presentazione sul tema: "APPUNTI SUL LINGUAGGIO C"— Transcript della presentazione:

1 APPUNTI SUL LINGUAGGIO C
Corso di Algoritmi e Strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Liste

2 Inserimento di un nuovo nodo Cancellazione di un nodo esistente
Liste concatenate Operazioni fondamentali: Inserimento di un nuovo nodo Cancellazione di un nodo esistente Ricerca di un nodo esistente

3 Lista come parametro di una funzione
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] puntatore al primo elemento x della lista Lista vuota: head[L] = NIL head[L] NIL

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

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

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

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

8 // definizione della struttura nodo typedef struct elem{
Liste 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;

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

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

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

12 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) next(y) <- x next(x) <- NIL

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

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

15 Inserimento di un nuovo nodo: in una posizione precisa
LUNG(L) x <- head(L) cont <- 0 while x ≠ NIL do x = next(x) cont <- cont + 1 return cont

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

17 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

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

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

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

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

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

23 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 cur <- next(cur) next(prev) <- NIL

24 Cancellazione di un nodo: in Coda
// funzione per cancellare in una lista il nodo in coda void cancellaInCoda(plist* l){ plist prev,cur; switch(lungLista(*l)) { case 0: printf("La lista e' vuota\n"); 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;

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

26 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 cur <- next(cur) pos = pos - 1 next(prev) <- next(cur)

27 Cancellazione di un nodo: in una posizione precisa
// funzione per cancellare inun alista un nodo in una data posizione void cancellaInPos(plist* l, int pos){ plist prev,cur; int ln = lungLista(*l); if (ln<pos) printf("La lunghezza della lista e' minore della posizione fornita\n"); else switch(pos) { case 0: printf("Hai fornito una posizione non valida\n"); break; case 1: cancellaInTesta(l); break; default: prev = *l; cur=prev->next; while (pos>2){ prev = cur; cur = cur->next; pos--; } prev->next=cur->next; free(cur);

28 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

29 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; }

30 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 il nodo 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)

31 APPUNTI SUL LINGUAGGIO C
Corso di Algoritmi e strutture Dati APPUNTI SUL LINGUAGGIO C Esercizi su Liste FINE


Scaricare ppt "APPUNTI SUL LINGUAGGIO C"

Presentazioni simili


Annunci Google