Hai una domanda da fare?

Titolo Messaggio:

Poni la tua domanda:

Seleziona categoria::
  1. #1

    [Source] Gestione liste dinamiche

    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;



    Crimson Games lead programmer

    Contattami su Skype: manhunterita
    o mandami una mail: m4nu.91@gmail.com

    SeCure©: il nuovo software di gestione del tuo server è ora disponibile! Contattami per saperne di più!


  2.  

  3. #2
    Posto anche la versione in c++ fatta tra l'altro ieri l'altro
    Codice PHP:
    #include <iostream>
    using namespace std;
    class 
    nodo{
        private:
            
    int info
            
    nodo *pnext
        public: 
            
    nodo(){info=0pnext=NULL;}
            
    nodo(int i){info=ipnext=NULL;} 
            
    nodo(int inodop){info=ipnext=p;}
            
    int getInfo(){return info;}
            
    nodogetPnext(){return pnext;}
            
    void setInfo(int i){info=i;}
            
    void setPnext(nodo *p){pnext=p;}
            
    void set(int inodo *p){info=ipnext=p;}
    };

    class 
    lista {
    private:
    nodo *p0;
    public:
    lista(); //costruttore di default
    lista(int el); //costruttore con parametri
    lista(lista &l);    //costruttore copia
    ~lista(); //distruttore
    nodogetFront(){return p0;}
    int ins_testa(int el); //inserimento in testa
    int ins_coda(int el);//inserimento in coda
    void scansione();//scansione
    int remove(int el);//cancellazione
    int empty(); //restituisce 1 se la lista è vuota
        
    friend ostreamoperator<<(ostream &outlista &l);
    };
    lista::lista() { p0=NULL; }
    lista::lista(int el){ 
      
    p0=new nodo(el); 
      if (!
    p0) { cout<<endl<<"Allocazione fallita"; exit(0); }
    }
    lista::lista(lista &l){
    nodo *pa=l.p0;
      
    p0=NULL;
      while(
    pa!=NULL)
            { 
    ins_coda(pa->getInfo());
              
    pa=pa->getPnext(); 
            } 
    }
    lista::~lista(){ 
      
    nodo *pa=p0;
      while(
    p0!=NULL)   //l'uso di pa o p0 per avanzare nella lista è indifferente, 
                        //purchè la cancellazione avvenga sull'altro puntatore
        
    p0=p0->getPnext();
          
    delete pa
          
    pa=p0; }
    }
    int lista::ins_testa(int el){
      
    nodo *pn=new nodo(el,p0);
      if (!
    pn) return 0;
      
    p0=pn
      return 
    1;
    }
    int lista::ins_coda(int el){
     
    nodo *pa, *pn=new nodo(el);
     if (
    pn==NULL) return 0//Allocazione fallita
     
    if (empty()) //Se la lista è vuota, in alternativa a p0==NULL
        
    p0=pn;
     else{ 
    pa=p0;
           while (
    pa->getPnext()!=NULLpa=pa->getPnext();
           
    pa->setPnext(pn); 
         }
     return 
    1;
    }
    void lista::scansione(){
      
    nodo *pa=p0;
      if (!empty())
         { while (
    pa!=NULL)
              { 
    cout<<pa->getInfo()<<"  ";
                
    pa=pa->getPnext(); } 
         }
      else 
    cout<<"La lista e' vuota."<<endl
    }
    int lista::remove(int el){
      
    nodo *pa,*pc;
     if (!empty()){            
    //Se la lista non è vuota
      
    if (p0->getInfo()==el)   //se si deve cancellare il primo elemento
         
    pc=p0;
           
    p0=p0->getPnext();
           
    delete pc;
           return 
    1;
         }
      else { 
    pc=p0->getPnext();  //se il primo elemento non deve essere cancellato...
             
    pa=p0;
             if (
    pc!=NULL) {     //...e c'è almeno un altro elemento
        
    while (pc->getInfo()!=el && pc->getPnext()!=NULL){
                    
    pa=pa->getPnext();
             
    pc=pc->getPnext(); 
    }
        if (
    pc->getInfo()==el){    //se si trova l'elemento, lo si cancella
             
    pa->setPnext(pc->getPnext());
             
    delete pc
                     return 
    1;
                    }
       }
           }
      }   
      return 
    0;//se la lista è vuota o l'elemento non è presente
    }
    int lista::empty(){
      if (
    p0==NULL) return 1;
      return 
    0; }
    ostreamoperator<<(ostream &outlista &l){
      
    nodo *pa=l.p0;
      if (
    l.p0!=NULL)
         { while (
    pa!=NULL)
              { 
    out<<pa->getInfo()<<"  ";
                
    pa=pa->getPnext(); } 
         }
      else 
    out<<"La lista e' vuota."<<endl
      return 
    out;

    - - - Updated - - -

    è solo una interfaccia, quindi potete utilizzare le 2 classi come base per i vostri proggettini se necessario
    "Se leggo ricordo, se vedo capisco, se provo imparo"








  4.  

Ti consigliamo di leggere anche...

  1. [Source] Gestione Stack
    Di ManHunter nel forum C / C++
    Risposte: 6
    Ultimo Messaggio: 15/10/14, 11:39
  2. Risposte: 19
    Ultimo Messaggio: 24/03/14, 12:59
  3. Risposte: 10
    Ultimo Messaggio: 3/09/11, 12:40

Sponsor

I visitatori sono atterrati su questa pagina cercando:

gestione dinamica di una lista

gestione lista dinamica C

esempio lista dinamica c

c liste stampa nodo

liste.h

inserimento elementi liste dinamiche c

gestione liste dinamiche in c

gestire lista dinamica in c

programma eliminazione elementi uguali lista dinamica

c sorgete liste

Accedi