






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Piccoli appunti su funzioni e procedure riguardanti le strutture dati array e liste. Le funzioni proposte sono di carattere generale (tipo creazione di lista ecc) e alcune esercitazioni in linea con gli esercizi del primo compitino. I cenni teorici riguardano soprattutto l'allocazione dinamica della memoria.
Tipologia: Appunti
1 / 12
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







#include <stdio.h> void swap (int* a, int* b) { int temp=*b; b=a; *a=temp; } void bubble (int a[ ],int fine) { //porto il più grande in fondo int i; for (i=0;i<fine;i++) if (a[i]>a[i+1]) swap(&a[i],&a[i+1]); } void sort(int a[ ],int dim) { int i; for (i=dim; i>1; i--) bubble(a,i); }
int indicemax (int a[ ], int dim) { int i, max=a[0], index=-1; for (i=1; i<dim; i++) if(a[i]>max) { max=a[i]; index=i; } return index; //Avessi messo >= avrei trovato l’indice dell’ultima occ. }
int stesseoccorrenze( int a[ ],int b[ ],int dim) { int i=0,ok=1; while (i<dim && ok) if (conta(a[i],a,dim)==conta(a[i],b,dim) i++; else ok=0; return ok; }
Una struttura dinamica è una struttura dati che può modificare la sua dimensione
durante l’esecuzione del programma. La struttura dato ARRAY/MATRICE è una
struttura statica mentre una struttura dinamica è rappresentata dalla LISTA. La
LISTA è una struttura omogenea (tutti gli elementi sono dello stesso tipo)
dinamica (posso aggiungere e togliere elementi).
Le strutture dinamiche non possono essere gestite sulla memoria a pila infatti
vengono gestite su una memoria dinamica detta HEAP.
Per capire come vengono trattate le strutture dinamiche, dobbiamo aggiungere
allo stato astratto ambiente-memoria, la memoria Heap. In concreto una parte
della memoria del calcolatore a disposizione del programma in esecuzione viene
gestita come una pila di frame mentre una parte come memoria dinamica. La
memoria dinamica è indipendente dalla gestione a blocchi e viene allocata
(riservata) e deallocata (liberata) in modo esplicito, cioè attraverso funzioni e
procedure predefinite. La memoria dinamica è gestita come una sequenza di
parole di memoria senza struttura.
Allocazione Esplicita
Funzione malloc () che ha per argomento lo spazio da allocare in memoria heap e
che restituisce l’indirizzo della prima parola di memoria riservata. Per effettuare
l’allocazione dobbiamo sapere prima quanto spazio necessitiamo per quel tipo di
struttura, per questo ci serviamo della funzione Sizeof() che, dato per parametro
un tipo, ci restituisce lo spazio che occupa in memoria un oggetto del tipo
passato.
In C è presente un costruttore di tipo, che permette di definire nuovi tipi a partire
da tipi conosciuti, che si chiama Struct. La struct permette di prendere oggetti di
tipo diverso e di costruire con essi un nuovo tipo.
Es. struct el { int a; int b; float c; } main() { struct el* p; struct el x; p=malloc(Sizeof(struct el)); //malloc restituisce indirizzo x.a=18; x.c=7.61; // Notazione x.a significa //l’elemento di nome a della //struttura associata ad x }
Alla chiusura del blocco main si effettua un pop su ambiente e memoria mentre
la mem H rimane riservata perché indipendente dalla gestione a blocchi. La
parola di memoria Hn rimane riservata e quindi non accessibile; si definisce
infatti “garbage” perché non più liberabile se si è perso il puntatore a quella
parola di memoria.
typedef struct edl { int info; struct edl* next; }edl; //elemento di lista void crealista(int n,edl*l) { l=NULL;//Creo la lista vuota int i; edl corr; if (n>0) { l=malloc(sizeof(edl)); (l)->info=1; corr=(l); //definisco l’elemento corrente for (i=2; i<=n;i++) { corr->next=malloc(sizeof(edl)); corr=corr->next; corr->info=i oppure scanf(“%d”,&corr->info) } corr->next=NULL;//per chiudere la lista } }
void addafter(edll,int v,int el) { int trovato=0; edl corr=l; while(!trovato && corr!=null) /Metto corr diverso da null perchè se scrivessi corr->next!=null non mi considererebbe l’ultimo elemento della lista/ { if(corr->info==el) trovato=1; else corr=corr->next; if (trovato) { edl* aus; aus=malloc(sizeof(edl); aus->info=v;
aus->next=corr->next corr->next=aus; } } }
void addbefore(edl** l,int v,int el){ { int trovato=0; edl* prec=NULL;//puntatore all’elemento precedente edl* corr=l;//puntatore elemento corrente while(!trovato && corr!=NULL) { if(corr->info==el)trovato=1; else { prec=corr; //no prec=prec->next perchè inizializzato a NULL corr=corr->next; } if (trovato) { edl aus; aus=malloc(sizeof(edl)); aus->info=v; //Devo distinguere se attaccare in testa o no if(prec==NULL)//Primo elemento { aus->next=*l; *l=aus; } else { aus->next=corr; prec->next=aus; } } }