int *rows(int n, char *M[n][n], char *s,
int *pR) che ritorna in un array, allocato dinamicamente, gli indici delle righe della
matrice di stringhe M che contengono la stringa s; in *pR
restituisce il numero di righe che deve anche essere uguale alla dimensione dell'array
ritornato. Se la stringa s non compare nella matrice, ritorna NULL e restituisce 0
in *pR. Ad esempio, se la matrice è
"red" "green" "yellow" "brown" "blue" "brown" "blue" "red" "red"(quindi
n = 3) e s = "red", la funzione ritorna
l'array [0, 2] e in *pR restituisce 2.
typedef struct {
long code;
char descr[40];
} Rec;
Scrivere una funzione void update(char *fname, void (*upF)(Rec *))
che preso in input il nome fname di un file binario che contiene una sequenza
di records di tipo Rec, legge ogni record del file e lo riscrive dopo averlo
aggiornato tramite la funzione upF. Ad esempio, se il file contiene
{1203,"vite"},{1204,"chiodo"},{1208,"martello"},{1207,"bullone"}
e la funzione upF aggiorna i records con campo code pari scrivendo
in maiuscole il contenuto del campo descr, allora la funzione aggiorna il file così
{1203,"vite"},{1204,"CHIODO"},{1208,"MARTELLO"},{1207,"bullone"}.
typedef struct Elem {
int code;
char * str; //stringa allocata dinamicamente
struct Elem *next;
} Elem, *List;
Scrivere una funzione void compact(List L) che riduce ogni
sottolista di L formata da elementi consecutivi con lo stesso codice (campo code)
a un solo elemento che contiene nel campo str la concatenazione di tutte
le stringhe degli elementi della sottolista. Il puntatore al primo elemento della lista non
deve essere modificato e la memoria degli elementi eliminati deve essere rilasciata.
Ad esempio, se la lista è
{100, "La"} → {100, "Li"} → {100, "La"} → {110, "Lu"} →
→ {105, "Lo"} → {105, "La"} → {100, "Li"} → {100, "Le"}
allora la lista sarà modificata così
{100, "LaLiLa"} → {110, "Lu"} → {105, "LoLa"} → {100, "LiLe"}