Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    lista concatenata a doppio scorrimento

    il codice è scritto in c++, non ci sono errori di sintassi, ma stranamente quando provo ad inserire il secondo elemento esce dal programma...

    il programma dovrebbe inserire in memoria numeri, ordinati all'inserimento..

    ecco il listato:

    Codice PHP:
    //non è pho l'ho inserito tra i tag PHP per non perdere la formattazione!
    #include <stdio.h>
    #include <stdlib.h>
    #include <malloc.h>

    struct nodo
      
    {
        
    nodo *prec;
        
    int anni;
        
    nodo *succ;
      };

          
    nodo *plista, *pfantoccio;
          
    nodo *pbuff;
          
    int risp,numero,ritorno;

    //funzione inserimento      
    int inserisci(int dato)
    {

    if (
    plista==NULL) {

                     
    plista=(nodo*)malloc(sizeof(nodo)); //alloca un nuovo nodo
                     
    plista->anni=dato//allora l'eta
                     
    plista->prec=NULL;  //prec e succ puntano a null
                     
    plista->succ=NULL;

                     return 
    1;
                   } else {

      
    pbuff=(nodo*)malloc(sizeof(nodo)); //alloca in ogni caso un nuovo nodo
      
    pbuff->anni=dato//allora in ogni caso l'eta

    if (plista->anni dato) {
                              
    //se il dato da inserire e' minore del dato puntato da plista scorre indietro finche la condizione non cambia oppure plista->prec=NULL (a questo punto inserirebbe in testa)
                              
    while (plista->anni dato || plista->prec!=NULL){
                                    
    plista=plista->prec;
                                    }
                                    
    //riordino i puntatori
                                    
    pfantoccio=plista->prec;
                                    
    plista->prec=pbuff;
                                    
    pbuff->succ=plista;
                                    
    pbuff->prec=pfantoccio;  //pfantoccio puo essere NULL o un indirizzo
                                    
    return 2;
                           } else {
                                   
    //se il dato da inserire e' maggiore del dato puntato da plista scorre avanti finche la condizione non cambia oppure plista->succ=NULL (a questo punto inserirebbe in coda)
                              
    while (plista->anni dato || plista->succ!=NULL){
                                    
    plista=plista->succ;
                                    }
                                    
    //riordino i puntatori
                                    
    pfantoccio=plista->succ;
                                    
    plista->succ=pbuff;
                                    
    pbuff->prec=plista;
                                    
    pbuff->succ=pfantoccio;
                                    return 
    3;
                                  }
                          }
    }

    int main()
    {
    plista=NULL;      
    while(
    risp!=3)
                      {
                        
    printf("_______OPERAZIONI_______\n");
                        
    printf("\n");
                        
    printf("1. Inserisci\n");
                        
    printf("2. Visualizza\n");
                        
    printf("3. Esci\n");
                        
    printf("________________________\n");
                        
    scanf("%i",&risp);
                          if (
    risp==1) {
                                          
    //operazione inserisci
                                          
    printf("Dammi il numero da inserire\n");
                                          
    scanf("%i",&numero);
                                          
    ritorno=inserisci(numero);

                                            if (
    ritorno==1) {
                                                   
    printf("E' il primo inserimento\n");
                                              } else if (
    ritorno==2){
                                                   
    printf("Ho inserito a sinistra del puntatore\n");
                                              } else if (
    ritorno==3){
                                                   
    printf("Ho inserito a destra del puntatore\n");
                                              } else {
                                                  
    printf("Errore nell'inserimento\n");
                                                     }
                                          
    //fine inserisci
                                          
                          
    } else if (risp==2) {
                          
    //operazione visualizza, da completare
                          
    } else if (risp==3) {
                          
    //nessun istruzione, esce;
                          
    }
                          else {
                          
    //operazione non valida
                          
    printf("Operazione non valida! \n");
                          }
                        }

    provatelo e cercate di trovare l'errore.. io proprio non capisco.. grazie

  2. #2
    io ti consiglierei un btree per quello che vorresti fare:
    codice:
     
    /// The tree node
    typedef struct CTreeNode_t 
    { 
    	int n;                           
    	struct CTreeNode_t* left;
    	struct CTreeNode_t* right;
    } CTreeNode, *PCTreeNode;
    
    /// The tree class
    class CTree {
      private:
        PCTreeNode FRoot;
        void InternalDestroyCTree(PCTreeNode&);
        void InternalAdd(int, PCTreeNode&);
        void InternalShowInOrder(PCTreeNode);
        int InternalSearch(int, PCTreeNode);
      public:
        CTree()
        { 
        	FRoot = NULL;
        };
        virtual ~CTree() 
        { 
        	InternalDestroyCTree(FRoot); 
        };
        void Add(int n);
        void ShowInOrder();
        int Search(int n)
        {
        	return InternalSearch(n, FRoot);
        };
    };
    
    void CTree::InternalAdd(int n, PCTreeNode& ARoot)
    {
         if (ARoot == NULL)
         {
             ARoot = new CTreeNode;
             ARoot->n = n;
             ARoot->left = NULL;
             ARoot->right = NULL;
         }
         else
         if (n <= ARoot->n) InternalAdd(n, ARoot->left);
         else
         if (n > ARoot->n) InternalAdd(n, ARoot->right);
    }
    
    void CTree::Add(int n)
    {
         InternalAdd(n, FRoot);
    }
    
    void CTree::InternalShowInOrder(PCTreeNode P)
    {
         if (P->left) InternalShowInOrder(P->left);
         std::cout << "\t" << P->n << "\n \t";
         if (P->right) InternalShowInOrder(P->right);
    }
    
    void CTree::ShowInOrder()
    {
         std::cout << "Items sorted: ";
         InternalShowInOrder(FRoot);
         std::cout << std::endl;
    }
    
    void CTree::InternalDestroyCTree(PCTreeNode& P)
    {
         if (P->left) InternalDestroyCTree(P->left);
         if (P->right) InternalDestroyCTree(P->right);
         delete P;
         P = NULL;
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  3. #3
    quelli non sono i nodi?

    devo fare una lista concatenata io.. e sono limitato a questo (è un programma "didattico")..

    e non riesco a capire dov'è il problema al secondo inserimento..il primo, va bene, dice che ha inserito il primo nodo.. il secondo non da nessun errore però esce dal programma.. e invece dovrebbe continuare!

  4. #4
    up

  5. #5
    Originariamente inviato da scooter87
    up
    la prossima volta il linguaggio specificalo nel titolo della discussione, come da regolamento.
    grazie

    05.08.2005 - by alka
    Auguri all'angelo custode dei moderatori.

  6. #6
    ok.. scusa

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.