-
[35] Si fornisca una implementazione delle seguenti
funzioni, presenti nella libreria standard
<string.h>
- int strncmp(const char *cs, const char *ct, size_t n),
che compara al più n caratteri delle due stringhe,
ritornando -1, 0 o 1 a seconda che
(il frammento di) cs preceda, coincida o segua
nell'ordine lessicografico (il frammento di) ct;
- char *strncat(char *s, const char *ct, size_t n),
che concatena al più n caratteri della stringa ct
alla stringa s, terminando quest'ultima con '\0',
e poi restituisce s;
- char *strncpy(char *s, const char *ct, size_t n),
che copia al più n caratteri della stringa ct
sulla stringa s, inserendo eventualmente il numero necessario
di '\0' per raggiungere la lunghezza desiderata, e poi
restituisce s.
Negli ultimi due casi precedenti si può assumere che il parametro
attuale per s punti ad un blocco di memoria sufficientemente grande
per l'operazione richiesta.
-
[36] Si fornisca una implementazione delle seguenti
funzioni per la manipolazione di stringhe
- char *strndup(char *ct, size_t n),
che copia in un area di memoria allocata dinamicamente al più
n caratteri della stringa ct, restituendo poi un
puntatore alla copia;
- char *strnjoin(char *ar[ ], int n),
che riceve in input un array lungo n di stringhe, e restituisce
una nuova stringa, allocata dinamicamente, che contiene la concatenazione
delle stringhe presenti nell'array ar.
-
[37] Si realizzi una struttura dati che rappresenta
una tabella di ampiezza illimitata che può contenere stringhe
di lunghezza variabile. Si implementino le funzioni di inserzione
insert(...) e rimozione delete(...)
di una stringa, in modo che tutte le stringhe siano distinte ed
ordinate. Si implementi poi una funzione di ricerca
sort(...), che controlla l'appartenenza di una data
stringa alla tabella. Ad esempio, una porzione di tabella potrebbe
essere la seguente
.... 10 minni 11 paperino 12 pluto 13 topolino ...
dove l'inserzione della stringa "pippo" trasforma la
tabella in
.... 10 minni 11 paperino 12 pippo 13 pluto 14 topolino ...
La ricerca della stringa "pluto" produce poi come
risultato un puntatore alla cella 13; mentre la
cancellazione della stringa "paperino" produce la tabella
.... 10 minni 11 pippo 12 pluto 13 topolino ...
Si definiscano due opportuni file tabella.h e
tabella.c che realizzino la stuttura dati. Si scriva
poi un semplice programma che includa tabella.h e
testi le funzioni esportate dal file di header.
Nota: Si progetti l'inserzione in maniera tale
che la tabella venga mantenuta ordinata senza invocare alcun
algoritmo di ordinamento; inoltre, visto che le stringhe sono di
lunghezza variabile, si fornisca una soluzione che ottimizzi lo
spazio di memoria richiesto per la gestione della tabella.
-
[38] Si scriva un opportuno Makefile che compili
correttamente il programma suddiviso in più file e generi un
eseguibile chiamato prova_tabella.
-
[39] Si estenda la struttura dati in modo che adesso
ogni voce contenga, oltre ad una stringa, il numero di
occorrenze di detta stringa. Dunque, l'invocazione di
insert incrementerà il numero di occorrenze,
se la voce era già presente; mentre la delete
lo decrementerà, togliendo la voce solo quando il suo numero
di occorrenze è pari a 0.
|