Esercitazione #6



Esercizi sulla libreria per le stringhe

  • [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.