Linguaggio C Esercizi su puntatori e liste Walter Didimo (e-mail:didimo@dia.uniroma3.it) supplemento al Corso di Calcolatori Elettronici (Riccardo Torlone) 1 Esercizio 1 Siano p e q due puntatori a variabili intere. Si scriva un programma che svolga i seguenti punti, per ognuno dei quali viene data una funzione apposita: alloca dinamicamente due variabili intere ed assegna gli indirizzi corrispondenti a p e q, rispettivamente memorizza nelle due variabili intere due valori inseriti dall'utente stampa il contenuto delle variabili intere ed i loro indirizzi di memoria scambia gli indirizzi di memoria in p e q e ristampa il contenuto delle variabili intere e dei loro indirizzi dopo lo scambio 2
#include<stdio.h> #include<stdlib.h> Programma (1/2) void alloca_variabili (int **pp, int **qp){ *pp = (int *)malloc(sizeof(int)); *qp = (int *)malloc(sizeof(int)); void memorizza(int *p, int *q){ printf ("\ninserire due interi separati da uno spazio.."); scanf ("%d %d", p, q); void stampa (int *p, int *q){ printf ("\nindirizzo: %p, contenuto: %d",p,*p); printf ("\nindirizzo: %p, contenuto: %d",q,*q); 3 Programma (2/2) void scambia (int **p, int **q){ int *temp; temp = *p; *p = *q; *q = temp; int main (){ int *p, *q; alloca_variabili (&p,&q); memorizza (p,q); stampa (p,q); scambia (&p,&q); stampa (p,q); return 0; 4
Esercizio 2 Sia L una lista di record, ciascuno dei quali ha i seguenti campi: nome : di tipo stringa cognome : di tipo stringa età : di tipo intero Si scriva un programma che permette di eseguire le seguenti operazioni su L: aggiunge un nuovo record con dati specificati dall utente cancella un record con età specificata dall utente cancella tutti i record con età specificata dall utente stampa tutti i record della lista 5 #include<stdio.h> #include<stdlib.h> #include<string.h> Programma (1/7) typedef char String[20]; /* tipo puntatore ad elemento */ typedef struct elem* PElem; /* tipo puntatore a lista (cioè ad elemento)*/ typedef struct elem* PList; typedef struct elem { String nome; String cognome; int eta; PElem next; Elem; 6
Programma (2/7) /* inizializza la lista come vuota */ PList initlist(){ return NULL; /*end initlist*/ /* aggiunge un elemento in testa alla lista e ritorna il nuovo puntatore alla lista */ PList add (PList first, String _nome, String _cognome, int _eta){ PElem p; p = (PElem)malloc(sizeof(Elem)); strcpy(p->nome,_nome); strcpy(p->cognome,_cognome); p->eta = _eta; p->next = first; return p; /*end add*/ 7 Programma (3/7) /* ricerca e ritorna la posizione del primo record con età specificata; se un tale record non esiste ritorna NULL; in *pp mette la posizione del record precedente a quello cercato (serve per la cancellazione) */ PElem find (PList first, int _eta, PElem *pp){ PElem p = first; *pp = NULL; while (p){ if (p->eta == _eta) break; *pp = p; p = p->next; /*end while*/ return p; /*end find*/ 8
Programma (4/7) /* cancella il primo record con età specificata e ritorna il nuovo puntatore alla lista */ PList del (PList first, int _eta){ PElem p, p_pred, p_succ; p = find (first, _eta, &p_pred); if (p){ p_succ = p->next; if (p_pred){ p_pred->next = p_succ; free (p); /*end if*/ else{ free (p); first = p_succ; /*end else*/ /*end if*/ return first; /*end del*/ 9 Programma (5/7) /* cancella tutti i record con età specificata e ritorna il nuovo puntatore alla lista */ PList delall (PList first, int _eta){ PElem p_pred; while ( find (first, _eta, &p_pred) ) first = del (first, _eta); return first; /*end delall*/ /* stampa tutti i record della lista */ void print (PList first){ PElem p = first; while (p){ printf ("\nnome : %s", p->nome); printf ("\ncognome: %s", p->cognome); printf ("\netà : %d\n", p->eta); p = p->next; /*end while*/ /*end print*/ 10
Programma (6/7) int main (){ int option; PList first = initlist(); do{ printf ("\n\n1 - aggiungi record"); printf ("\n2 - cancella record"); printf ("\n3 - cancella tutti i record"); printf ("\n4 - stampa elementi"); printf ("\n5 - esci"); printf ("\nscegli opzione.."); scanf ("%d",&option); switch (option){ case 1:{ String _nome, _cognome; int _eta; printf ("\nnome cognome.."); scanf ("%s %s",_nome,_cognome); printf ("\netà.."); scanf ("%d",&_eta); first = add (first,_nome,_cognome,_eta); break; 11 Programma (7/7) case 2: case 3:{ int _eta; printf ("\netà.."); scanf ("%d",&_eta); if (option==2) first = del (first,_eta); else first = delall (first, _eta); break; case 4: print (first); break; default: break; /*end switch*/ /*end do*/ while (option!= 5); return 0; /*end main*/ 12