Seconda Prova Di Esonero - 11 Gennaio 2022: Esercizio N. 1
Seconda Prova Di Esonero - 11 Gennaio 2022: Esercizio N. 1
Risolvere i seguenti problemi proponendo, per ciascun esercizio, la codifica in linguaggio C di un programma
completo. La prova dura tre ore, durante le quali non è possibile allontanarsi dall’aula, se non dopo aver
consegnato l’elaborato scritto. Per superare la prova di esonero è necessario ottenere almeno 15 punti; tuttavia
affinché le prove di esonero siano valide è necessario che la media dei voti del primo e del secondo esonero sia
maggiore o uguale a 18/30. È possibile utilizzare libri e appunti personali, senza scambiarli con altri studenti.
I compiti che presenteranno evidenti ed anomale “similitudini” saranno annullati.
Esercizio n. 1
Lette in input le liste di adiacenza di un grafo non orientato G = (V, E), visualizzare in output, se
esistono, tutte le coppie di vertici u, v ∈ V (G) tali che u domini v (il vertice u domina il vertice v
se N [v] \ {u} ⊆ N [u], ossia se u è adiacente a tutti i vertici a cui è adiacente anche v).
v0
G = (V, E)
v5 v1
v4 v2
v3
Soluzione
1 #include <stdlib.h>
2 #include <stdio.h>
3 #define MAX 100
4
5 struct nodo {
6 int info;
7 struct nodo *next;
8 };
9
10 struct nodo *leggiLista(void) {
11 struct nodo *p, *primo = NULL;
12 int i, n;
13 printf("Numero di elementi: ");
14 scanf("%d", &n);
15 printf("Inserisci %d vertici: ", n);
16 for (i=0; i<n; i++) {
17 p = malloc(sizeof(struct nodo));
18 p->next = primo;
19 scanf("%d", &p->info);
20 primo = p;
21 }
22 return(primo);
23 }
24
53 int main(void) {
54 struct nodo *G[MAX];
55 int n, i, j;
56 n = leggiGrafo(G);
2
57 for (i = 0; i < n; i++)
58 for (j = 0; j < n; j++)
59 if (i != j && domina(G, i, j))
60 printf("%d domina %d\n", i, j);
61 return(0);
62 }
3
Esercizio n. 2
Generare una lista di n numeri casuali interi maggiori di zero e minori di 10, L : v0 → v1 →
... → vn−1 . Visualizzare in output la lista. Partendo dal primo elemento della lista, v0 , visualizzare
iterativamente l’elemento vi e poi l’elemento che si trova vi posizioni dopo nella lista, fino al
termine della lista.
3 → 2 → 4 → 2 → 1 → 2 → 5 → 8 → 4 → 2 → 3 → NULL
Soluzione
1 #include <stdlib.h>
2 #include <stdio.h>
3 #include <time.h>
4
5 struct nodo {
6 int info;
7 struct nodo *next;
8 };
9
4
33
51 int main(void) {
52 struct nodo *p;
53 p = listaCasuale();
54 stampaLista(p);
55 stampaElementi(p);
56 return(0);
57 }