Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Corso di Programmazione 1 a.a.2007/2008 Prof.ssa Chiara Petrioli Corso di Laurea in Informatica Università degli Studi La Sapienza (esercizi di preparazione al secondo esonero)
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 1 Data una lista L di interi e dato un intervallo [i,j] si scriva una funzione che verifichi se esistono in L valori interi nellintervallo specificato La funzione dovrà prendere in input La funzione dovrà prendere in input una lista L una lista L due valori interi (i,j) due valori interi (i,j) Dovrà restituire in output Dovrà restituire in output 0 se nessuno degli elementi di L ha valori nellintervallo [i,j] 0 se nessuno degli elementi di L ha valori nellintervallo [i,j] 1 altrimenti 1 altrimenti Diamo la soluzione ricorsiva Diamo la soluzione ricorsiva
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 1-soluzione ricorsiva int Rfindintervallista (LISTA L, int i, int j) { if (L==NULL) return 0; else if ((L->elem>=i)&&(L->elem next,i,j)); }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 2 Data una lista L di interi e dato un intervallo [i,j] si scriva una funzione che calcoli il numero di elementi di L che abbiano un valore intero nellintervallo specificato La funzione dovrà prendere in input La funzione dovrà prendere in input una lista L una lista L due valori interi (i,j) due valori interi (i,j) Dovrà restituire in output Dovrà restituire in output Il numero di elementi di L che ha un valore in [i,j] Il numero di elementi di L che ha un valore in [i,j] Diamo la soluzione ricorsiva e la soluzione iterativa
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 2-soluzione ricorsiva int Rnum_occintervallista (LISTA L,int i, int j) { if (L==NULL) return 0; else if ((L->elem>=i)&&(L->elem next,i,j)); else return (Rnum_occintervallista(L->next,i,j)); } int Rnum_occintervallista (LISTA L,int i, int j) { if (L==NULL) return 0; else if ((L->elem>=i)&&(L->elem next,i,j)); else return (Rnum_occintervallista(L->next,i,j)); }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 2-soluzione iterativa int num_occintervallista (LISTA L,int i, int j) { int count=0; while (L!=NULL) { if ((L->elem>=i)&&(L->elem elem>=i)&&(L->elem<=j)) count++; L=L->next; } return count; }
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 3 Si scriva una funzione ricorsiva che data una lista L elimini un elemento, ne lasci val, elimini di nuovo un elemento, ne lasci val etc. Cosa intendiamo? – se val=3 vogliamo eliminare: il primo elemento il primo elemento il quarto elemento (lasciamo tre elementi) il quarto elemento (lasciamo tre elementi) Lottavo elemento etc.
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 3 –versione ricorsiva Si scriva una funzione Ricorsiva che, data una lista elimini Un elemento ogni val La funzione è chiamata Dal main con k==0 struct node { int elem; struct node *next; }; typedef struct node NODOLISTA; typedef NODOLISTA *LISTA; LISTA eliminaognik (LISTA l1, int k, int val) { LISTA temp; if (l1==NULL) return l1; else if (k==0) {temp=l1;l1=l1->next; free (temp); return eliminaognik(l1,val,val); }else{l1->next=eliminaognik(l1->next,k-1,val); return l1; }}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 3-variante void eliminaognikpuntpunt (LISTA *l1, int k, int val) { LISTA temp; if (*l1==NULL) return; else if (k==0) {temp=*l1;*l1=(*l1)->next; free (temp); eliminaognikpuntpunt(l1,val,val);return;}else{eliminaognikpuntpunt(&((*l1)->next),k-1,val);return;}} Si scriva una funzione Ricorsiva che, data una lista elimini Un elemento ogni val struct node { int elem; struct node *next; }; typedef struct node NODOLISTA; typedef NODOLISTA *LISTA;
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 4 Data una lista si scriva una funzione che elimini gli elementi con valori pari della lista (si fornisca una versione ricorsiva) Data una lista si scriva una funzione che elimini gli elementi con valori pari della lista (si fornisca una versione ricorsiva)
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 4 void eliminapari(LISTA *l1) { LISTA temp; if (*l1==NULL) return; else if ((*l1)->elem %2) {eliminapari(&(*l1)->next);return;}else{temp=*l1;*l1=(*l1)->next;free(temp);eliminapari(l1);return;}} Si scriva una funzione Ricorsiva che, data una lista elimini Gli elementi contenenti Valori pari
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 5 Si scriva una funzione che date due liste costruisca una terza lista data dallunione delle prime due Potete utilizzare allinterno del codice funzioni che abbiamo precedentemente definito
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 5 void mergeliste (LISTA *PTRLISTA, LISTA L1, LISTA L2) { LISTA curr, temp; temp=NULL;PTRLISTA=&temp; curr = L1; while (curr!=NULL) { if (!(Rfindlista(*PTRLISTA,curr->elem))) insertHEADlista(PTRLISTA,curr->elem); curr = curr->next; } curr = L2; while (curr!=NULL) { if (!(Rfindlista(*PTRLISTA,curr->elem))) insertHEADlista(PTRLISTA,curr->elem); curr = curr->next; }}
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 6 Si scriva una funzione che date due liste costruisca (e restituisca il puntatore alla testa di) una terza lista i cui elementi contengono tutti e soli i valori che sono presenti in entrambe le prime liste (ogni valore compare esattamente una volta) Potete utilizzare funzioni precedentemente definite
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 6 void intersezioneliste (LISTA *PTRLISTA, LISTA L1, LISTA L2) { LISTA curr, temp; temp=NULL;PTRLISTA=&temp; curr = L1; while (curr!=NULL) { if ((Rfindlista(L2,curr->elem)) &&(!(Rfindlista(*PTRLISTA,curr->elem)))) insertHEADlista(PTRLISTA,curr->elem); curr = curr->next; }} SUPPONETE CHE LE DUE LISTE L1 e L2 SIANO ORDINATE. POTETE RENDERE PIU EFFICIENTE IL CODICE?
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Glicini struct nodoramo{ int valore; struct nodoramo *succ; }; struct elemglicine{ struct nodoramo *ramo; struct elemglicine *next; }; typedef struct nodoramo NODO; typedef NODO *RAMO; typedef struct elemglicine GLICINE2; typedef GLICINE2 *GLICINEPTR; next ramo succ
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 7 Si scriva una funzione che dato un glicine stampi i valori dei suoi elementi
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 7 void stampaglicine (GLICINEPTR G) { RAMO r; if (G!=NULL) { printf("[ ] ->"); r=G->ramo;while(r!=NULL){printf("[[%d]]->",r->valore);r=r->succ;} printf("\n | \n"); stampaglicine(G->next);}} next ramo succ G
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 8 Si scriva una funzione che dato un glicine calcoli la somma dei suoi elementi pari Si possono utilizzare funzioni ausiliarie
Prof.ssa Chiara Petrioli -- corso di programmazione 1, a.a. 2007/2008 Esercizio 8 int sommapariramo(RAMO R) {if(R==NULL) return 0; else return((R->valore%2)?sommapariramo(R- >succ):(1+sommapariramo(R->succ))); } /*Post: restituisce il numero di valori pari nel glicine*/ int sommapari(GLICINEPTR G) { if (G==NULL) return 0; elsereturn(sommapariramo(G->ramo)+sommapari(G->next));} Funzione ausiliaria