Salve a tutti,

avendo io studiato le liste dinamiche e la loro gestione, ho deciso di condividere con voi le funzioni base per la manipolazione di tale struttura dati...
Nel download che segue troverete il file progetto (sia per Dev-C++ che per Code::Blocks) con un programma di esempio e l'header da includere nei vostri programmi.


Contenuto:

  • liste.h
    Codice PHP:
    #ifndef LISTE_H
    #define LISTE_H
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdlib.h>

    //<----------------------STRUTTURA----------------------->
    //Definizione del tipo tInfo
    typedef int tInfo;

    //Definizione struttura di un nodo
    struct tagNode{
        
    tInfo info;
        
    struct tagNodelink;
    };

    //Definizione del tipo tNode come struttura di un nodo
    typedef struct tagNode tNode;

    //Definizione del tipo tList come puntatore a tNode. Esso individua l'inizio di una lista
    typedef tNodetList;


    //<-----------------FUNZIONI--------------------->

    //Funzioni che agiscono su nodi
    tNodenodeCreatetInfo );/*Crea e alloca un nodo con informazione info e link che punta a NULL. Ritorna il puntatore al nuovo nodo.*/
    void nodeDestroytNode* );/*Dealloca il nodo passato come parametro*/


    //Funzioni che agiscono su una lista
    tList listCreate();/*Crea una lista vuota. Ritorna il riferimento a tale lista.*/
    tList listDestroytList ); /*Dealloca una lista cancellando ogni elemento contenuto in essa. Restituisce il riferimento alla lista.*/

    void printInfotInfo );
    void listPrinttList );/*Stampa ogni elemento di una lista*/

    bool isEmptytList );/*Restituisce TRUE se la lista è vuota e non presenta elementi, FALSE se esistono elementi*/
    bool greatertInfo tInfo );/*Stabilisce quale tra info1 e info2 è maggiore. Restituisce TRUE se info1 è più grande di info2, FALSE in caso contrario*/
    bool equaltInfo tInfo );/*Stabilisce se info1 e info2 sono uguali. Restituisce TRUE se info1 è uguale ad info2, FALSE in caso contrario*/

    tList listInserttListtInfo ); /*Inserisce all'interno di una lista un nodo contenente l'informazione info mantenendo l'ordinamento. Restituisce il riferimento alla lista.*/
    tList listDeletetListtInfo ); /*Cancella un elemento dalla lista mantenendo l'ordinamento. Restituisce il riferimento alla lista.*/

    tNodelistSearchtListtInfo ); /*Ricerca un elemento tInfo all'interno di una lista. Restituisce il riferimento all'elemento trovato*/


    #endif 
  • liste.c
    Codice PHP:
    #include "liste.h"

    /*Crea e alloca un nodo con informazione info e link che punta a NULL.
    Ritorna il puntatore al nuovo nodo.*/
    tNodenodeCreatetInfo info ){
        
    tNode *newNode;

        
    newNode = ( tNode* ) mallocsizeoftInfo ) );
        if( 
    newNode == NULL )
            return 
    NULL;
        
    newNode->info info;
        
    newNode->link NULL;

        return 
    newNode;
    }

    /*Dealloca il nodo passato come parametro*/
    void nodeDestroytNodenode ){
        
    freenode );
    }

    /*Crea una lista vuota.
    Ritorna il riferimento a tale lista.*/
    tList listCreate(){
        return 
    NULL;
    }

    /*Dealloca una lista cancellando ogni elemento contenuto in essa.
    Restituisce il riferimento alla lista.*/
    tList listDestroytList lista ){
        
    tNode *current, *next;

        
    next NULL;
        
    current lista;

        while( 
    current != NULL ){
            
    next current->link;
            
    nodeDestroycurrent );
            
    current next;
        }

        return 
    NULL;
    }


    void printInfotInfo info ){
        
    printf"\n\t%d\n"info );
    }


    /*Stampa ogni elemento di una lista*/
    void listPrinttList lista ){
        
    tNode *current;

        
    current lista;

        while( 
    current != NULL ){
            
    printInfocurrent->info );
            
    current current->link;
        }
    }

    /*Restituisce TRUE se la lista è vuota e non presenta elementi, FALSE se esistono elementi*/
    bool isEmptytList lista ){
        if( 
    lista == NULL )
            return 
    true;
        else
            return 
    false;
    }

    /*Stabilisce quale tra info1 e info2 è maggiore.
    Restituisce TRUE se info1 è più grande di info2, FALSE in caso contrario*/
    bool greatertInfo info1tInfo info2 ){
        if( 
    info1 info2 )
            return 
    true;
        else
            return 
    false;
    }

    /*Stabilisce se info1 e info2 sono uguali.
    Restituisce TRUE se info1 è uguale ad info2, FALSE in caso contrario*/
    bool equaltInfo info1tInfo info2 ){
        if( 
    info1 == info2 )
            return 
    true;
        else
            return 
    false;
    }

    /*Inserisce all'interno di una lista un nodo contenente l'informazione info mantenendo l'ordinamento.
    Restituisce il riferimento alla lista.*/
    tList listInserttList listatInfo info ){
        
    tNode *newNode, *previous, *current;

        
    current lista;
        
    previous NULL;

        while( 
    current != NULL && greaterinfocurrent->info ) ){
            
    previous current;
            
    current current->link;
        }
        
    newNode nodeCreateinfo );
        if( 
    newNode == NULL )
            return 
    lista;
        if( 
    previous == NULL ){
            
    newNode->link current;
            return 
    newNode;
        }
        
    previous->link newNode;
        
    newNode->link current;
        return 
    lista;
    }

    /*Cancella un elemento dalla lista mantenendo l'ordinamento.
    Restituisce il riferimento alla lista.*/
    tList listDeletetList listatInfo info ){
        
    tNode *current, *previous;

        
    current lista;
        
    previous NULL;

        if( 
    current == NULL )
            return 
    lista;

        while( 
    current != NULL && greaterinfocurrent->info ) ){
            
    previous current;
            
    current current->link;
        }

        if( 
    equalinfocurrent->info ) ){
            
    previous->link current->link;
            
    nodeDestroycurrent );
            return 
    lista;
        }
    }

    /*Ricerca un elemento tInfo all'interno di una lista.
    Restituisce il riferimento all'elemento trovato*/
    tNodelistSearchtList listatInfo info ){
        
    tNode *current;

        
    current lista;

        if( 
    current == NULL )
            return 
    NULL;

        while( 
    current != NULL && greaterinfocurrent->info ) )
            
    current current->link;

        if( 
    equalinfocurrent->info ) )
            return 
    current;
        else
            return 
    NULL;

  • main.c Sorgente di esempio di utilizzo delle funzioni...
    Codice PHP:
    #include "liste.h"

    int main(){
        
    tList newList;
        
    tNode *nodo;
        
    int sceltaOperazione;
        
    tInfo informazione;

        
    printf"\tGestione di una lista dinamica\n\n" );

        
    newList listCreate();

        do{

            do{
                
    //Menù
                
    printf"Scegli che operazione eseguire:\n" );
                
    printf"1) Inserisci elemento\n" );
                
    printf"2) Cancella elemento\n" );
                
    printf"3) Ricerca elemento\n" );
                
    printf"4) Stampa lista\n" );
                
    printf"5) Cancella lista\n" );
                
    printf"6) Lista vuota\n" );
                
    printf"7) Esci\n" );
                
    scanf"%d", &sceltaOperazione );
            }while( 
    sceltaOperazione || sceltaOperazione );

            
    //Gestione della scelta
            
    switch( sceltaOperazione ){
                case 
    1:
                    
    printf"\nInserisci l'informazione da inserire\t>" );
                    
    scanf"%d", &informazione );
                    
    newList listInsertnewListinformazione );
                    break;
                case 
    2:
                    
    printf"\nInserisci l'informazione da cancellare\t>" );
                    
    scanf"%d", &informazione );
                    
    newList listDeletenewListinformazione );
                    break;
                case 
    3:
                    
    printf"\nInserisci l'informazione da ricercare\t>" );
                    
    scanf"%d", &informazione );
                    
    nodo listSearchnewListinformazione );
                    if( 
    nodo != NULL )
                        
    printf"\nL'elemento \212 presente nella lista\n" );
                    else
                        
    printf"\nL'elemento non \212 presente nella lista\n" );
                    break;
                case 
    4:
                    
    listPrintnewList );
                    break;
                case 
    5:
                    
    newList listDestroynewList );
                    break;
                case 
    6:
                    if( 
    isEmptynewList ) )
                        
    printf"\nLa lista \212 vuota.\n" );
                    else
                        
    printf"\nLa lista non \212 vuota.\n" );
                    break;
                case 
    7:
                    
    printf"\nHai scelto di uscire. Arrivederci!\n\n" );
                    break;
            }


        }while( 
    sceltaOperazione != );


        
    system"PAUSE" );
        return 
    EXIT_SUCCESS;