Problema con lista ordinata

di il
12 risposte

Problema con lista ordinata

Salve a tutti.

Ho un grosso problema con una lista linkata ordinata. Ci sto sopra da giorni interi.
Il programma deve riceve in input cognome e nome, e deve gia metterli ordinati nella lista.
Il problema è che :
1)dopo il secondo inserimento, la visualizzazione mi fa vedere : lista vuota (quando in realtà dovrebbe farmi vedere primo e secondo inserimento gia ordinati)
2)al terzo inserimento, la visualizzazione mi fa vedere solo il terzo inserimento, e non i primi due.
3)Ripete dal punto 1)

Probabilmente ci deve essere qualche errore logico di implementazione.
Il codice del programma è il seguente :
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define maxdim 30

typedef
 struct {
          char cognome[maxdim];
          char nome[maxdim];
        }E;
struct nodo;
typedef  nodo *p;
struct nodo{
             E elem;
             p next;
           };


void inizializza (p *radice)
{                     
  *radice = NULL;    
   printf ("La lista e' vuota\n\n");
  system ("PAUSE");
  system ("CLS");
}


void push_testa (p *testa, E e)
{
       p nod;
           
              
       nod = (p)malloc(sizeof(nodo));
       strcpy(nod->elem.cognome,e.cognome);
       strcpy(nod->elem.nome,e.nome);
       nod->next = *testa;    
       *testa = nod;
              
}
  

void push_in_mezzo (p *nod, p *prec, E e)
{
      p nuovo_nodo;
     
      nuovo_nodo = (p)malloc(sizeof(nodo));
      
      strcpy(nuovo_nodo->elem.cognome,e.cognome);
      strcpy(nuovo_nodo->elem.nome,e.nome);
     
      (*prec)->next = nuovo_nodo;
      nuovo_nodo->next = *nod;
}

void insert (p *nod, p *prec, E e)
{
    
     
     printf ("Cognome : ");
     scanf ("%s",&e.cognome);
     printf ("Nome : ");
     scanf ("%s",&e.nome);
     
     if (*nod!=NULL)
      {
        while ((*nod!=NULL)&&(strcmp(e.cognome,(*nod)->elem.cognome)>0))
         {
                             
                             *prec = *nod;
                             *nod = (*nod)->next;
              };
         
         
       if ((*prec!=NULL)&&(*prec==*nod)) push_in_mezzo(nod,prec,e);
       }
        else push_testa (nod,e);
       
       system ("PAUSE");
       system ("CLS");
       
}


void visualizza (p nod)
{
     p nod_aux;
     
     if (nod==NULL)
      printf ("Lista vuota\n");
     else {
     nod_aux = nod;
     
     
     while (nod_aux!=NULL)
     {
           printf ("Cognome : %s\n",nod_aux->elem.cognome);
           printf ("Nome : %s\n",nod_aux->elem.nome);
           nod_aux = nod_aux->next;
     }
           }
     system ("PAUSE");
     system ("CLS");
     
}

int main()
{
    p node,preced;
    E contatto;
    char scelta;
    
    
    inizializza (&node);
    do{
        printf ("Menu'\n\n");
        printf ("Per inserire : i\n");
        printf ("Per visualizzare : v\n");
        printf ("Per uscire : u\n");
        printf ("Scelta : ");
        scanf ("\n%c",&scelta);
        
        if (scelta=='i') insert(&node,&preced,contatto);
         
        if (scelta=='v') visualizza (node);
     
      }while (scelta!='u');
      
      system ("PAUSE");
     
}
          
                              
     
Vi prego aiutatemi. E' un progetto d'esame.
Grazie in anticipo.

12 Risposte

  • Re: Problema con lista ordinata

    Il tuo problema è che perdi la testa della lista e poi vai a scrivere a random. Controlla cosa ho fatto così alla veloce modificando un po il tuo programma. Ci possono esseer dei errori quindi controlla con attenzione.
    
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define maxdim 30
    
    typedef
    struct {
              char cognome[maxdim];
              char nome[maxdim];
            }E;
    
    struct nodo{
                 E elem;
                 nodo *next;
               };
    
    typedef  nodo *p;
    
    void inizializza (p *radice)
    {                     
      *radice = NULL;   
       printf ("La lista e' vuota\n\n");
      system ("PAUSE");
      system ("CLS");
    }
    
    
    void push_testa (p *testa, E e)
    {
           p nod;
               
                 
           nod = (p)malloc(sizeof(nodo));
           strcpy(nod->elem.cognome,e.cognome);
           strcpy(nod->elem.nome,e.nome);
    	   if(*testa != NULL)
    	   {
    			nod->next = *testa;   
    			(*testa)->next = nod;
    	   }
    	   else
    	   {
    		   *testa = nod;
    		   nod-> next = NULL;
    	   }
                 
    }
     
    
    void push_in_mezzo (p *testa, p *ptr, E e)
    {
          p nuovo_nodo;
         
          nuovo_nodo = (p)malloc(sizeof(nodo));
         
          strcpy(nuovo_nodo->elem.cognome,e.cognome);
          strcpy(nuovo_nodo->elem.nome,e.nome);
         
          nuovo_nodo->next = (*ptr)->next;
    	  (*ptr)->next = nuovo_nodo;
    }
    
    void push_in_fondo (p *testa, p *ptr, E e)
    {
          p nuovo_nodo;
         
          nuovo_nodo = (p)malloc(sizeof(nodo));
         
          strcpy(nuovo_nodo->elem.cognome,e.cognome);
          strcpy(nuovo_nodo->elem.nome,e.nome);
         
          nuovo_nodo->next = NULL;
    	  (*ptr)->next = nuovo_nodo;
    }
    
    void insert (p *testa, E & e)
    {
    	 p ptr = *testa;
         printf ("Cognome : ");
         scanf ("%s",&e.cognome);
         printf ("Nome : ");
         scanf ("%s",&e.nome);
         
         if (ptr != NULL)
          {
            while ( (ptr !=NULL)&&(strcmp(e.cognome,(ptr)->elem.cognome)>0))
             {
    			ptr = ptr->next;
             };
    		if(ptr->next != NULL)
    			push_in_mezzo(testa,&ptr,e);
    		else
    			push_in_fondo(testa,&ptr,e);
           }
            else push_testa (testa,e);
           
           system ("PAUSE");
           system ("CLS");
           
    }
    
    
    void visualizza (p testa)
    {
         p nod_aux;
         
         if (testa==NULL)
          printf ("Lista vuota\n");
         else {
         nod_aux = testa;
         
         
         while (nod_aux!=NULL)
         {
               printf ("Cognome : %s\n",nod_aux->elem.cognome);
               printf ("Nome : %s\n",nod_aux->elem.nome);
               nod_aux = nod_aux->next;
         }
               }
         system ("PAUSE");
         system ("CLS");
         
    }
    
    int main()
    {
        p testa = NULL;
    	E contatto = {0};
        char scelta;
       
       
        inizializza (&testa);
        do{
            printf ("Menu'\n\n");
            printf ("Per inserire : i\n");
            printf ("Per visualizzare : v\n");
            printf ("Per uscire : u\n");
            printf ("Scelta : ");
            scanf ("\n%c",&scelta);
           
            if (scelta=='i') insert(&testa,contatto);
             
            if (scelta=='v') visualizza (testa);
         
          }while (scelta!='u');
         
          system ("PAUSE");
         
    }
    
    Non so perche a scuola vi fanno ancora studiare il vecchio C qundo il tutto si trasformerebbe in C++ così:
    
    std::list<nodo> listaOrdinata;
    nodo questoNodo;
    strcpy(questoNodo.nome,"Nome");
    strcpy(questoNodo.cognome,"Cognome");
    listaOrdinata.push_back(questoNodo);
    
  • Re: Problema con lista ordinata

    if(ptr->next != NULL)
             push_in_mezzo(testa,&ptr,e);
          else
             push_in_fondo(testa,&ptr,e);
           }
            else push_testa (testa,e);
    non ho capito qua cosa hai fatto. cioè, se ptr non è NULL, ok, inserisci in mezzo. poi tu hai scritto : in TUTTI gli altri casi fai sia push_in_fondo che push_testa xD
  • Re: Problema con lista ordinata

    NO non è così. Te lo riscrivo meglio:
    
    if (ptr != NULL)
    		{
    			while ( (ptr !=NULL)&&(strcmp(e.cognome,(ptr)->elem.cognome)>0))
    			{
    				ptr = ptr->next;
    			}
    			if(ptr->next != NULL)
    			{
    				push_in_mezzo(testa,&ptr,e);
    			}
    			else
    			{
    				push_in_fondo(testa,&ptr,e);
    			}
    		}
    		else push_testa (testa,e);
    
  • Re: Problema con lista ordinata

    Ah ecco sisi. ora mi trovo. ma comunque il programma crasha xD e soprattutto non ordina
  • Re: Problema con lista ordinata

    Hai ragione. Ho fatto un macello. Dammi il tempo di controllare.
  • Re: Problema con lista ordinata

    Eccolo:
    
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define maxdim 30
    
    typedef
    struct {
              char cognome[maxdim];
              char nome[maxdim];
            }E;
    
    struct nodo{
                 E elem;
                 nodo *next;
               };
    
    typedef  nodo *p;
    
    void inizializza (p *radice)
    {                     
      *radice = NULL;   
       printf ("La lista e' vuota\n\n");
      system ("PAUSE");
      system ("CLS");
    }
    
    
    void push_testa (p *testa, E e)
    {
           p nod;
               
                 
           nod = (p)malloc(sizeof(nodo));
           strcpy(nod->elem.cognome,e.cognome);
           strcpy(nod->elem.nome,e.nome);
    	   if(*testa != NULL)
    	   {
    			nod->next = *testa;   
    			(*testa) = nod;
    	   }
    	   else
    	   {
    		   *testa = nod;
    		   nod-> next = NULL;
    	   }
                 
    }
     
    
    void push_in_mezzo (p *testa, p *ptr, E e)
    {
          p nuovo_nodo;
         
          nuovo_nodo = (p)malloc(sizeof(nodo));
         
          strcpy(nuovo_nodo->elem.cognome,e.cognome);
          strcpy(nuovo_nodo->elem.nome,e.nome);
         
          nuovo_nodo->next = (*ptr)->next;
    	  (*ptr)->next = nuovo_nodo;
    }
    
    
    void insert (p *testa, E & e)
    {
    	 p ptr = *testa;
    	 p prec = NULL;
         printf ("Cognome : ");
         scanf ("%s",&e.cognome);
         printf ("Nome : ");
         scanf ("%s",&e.nome);
    
    
    		if (ptr != NULL)
    		{
    			while ( (ptr !=NULL)&&(strcmp(e.cognome,(ptr)->elem.cognome)>0))
    			{
    				prec = ptr;
    				ptr = ptr->next;
    			}
    			if(prec != NULL)
    			{
    				push_in_mezzo(testa,&prec,e);
    			}
    			else
    			{
    				push_testa(testa,e);
    			}
    		}
    		else push_testa (testa,e);
           
           system ("PAUSE");
           system ("CLS");
           
    }
    
    
    void visualizza (p testa)
    {
         p nod_aux;
         
         if (testa==NULL)
          printf ("Lista vuota\n");
         else {
         nod_aux = testa;
         
         
         while (nod_aux!=NULL)
         {
               printf ("Cognome : %s\n",nod_aux->elem.cognome);
               printf ("Nome : %s\n",nod_aux->elem.nome);
               nod_aux = nod_aux->next;
         }
               }
         system ("PAUSE");
         system ("CLS");
         
    }
    
    int main()
    {
        p testa = NULL;
    	E contatto = {0};
        char scelta;
       
       
        inizializza (&testa);
        do{
            printf ("Menu'\n\n");
            printf ("Per inserire : i\n");
            printf ("Per visualizzare : v\n");
            printf ("Per uscire : u\n");
            printf ("Scelta : ");
            scanf ("\n%c",&scelta);
           
            if (scelta=='i') insert(&testa,contatto);
             
            if (scelta=='v') visualizza (testa);
         
          }while (scelta!='u');
         
          system ("PAUSE");
         
    }
    
  • Re: Problema con lista ordinata

    Ehmmm non funziona ^____^ se metti un elemento in coda non funziona ^_^
    se lo metti in coda, visualizza solo la coda
  • Re: Problema con lista ordinata

    Fammi capire. Io inserisco a inizio coda, fine coda e mezzo coda e a me funzia. cmq dai uno sguardo anche quì.
    http://twiki.di.uniroma1.it/pub/Programmazione2ad/WebHome/ListeOrd.pdf
    Ci sono dei esempi. Cerca di applicarli. Per le poche prove che ho fatto a me ha funzionato. Solo che non posso seguirti molto x il momento (sai si lavora ogni tanto). Vediamo cosa hai combinato fino a stasera quando sarò + libero.
  • Re: Problema con lista ordinata

    Non lo riesco a capire...

    edito : il tuo programma funziona!!! Non capisco perchè prima non me lo faceva funzionare :\
    adesso mi studio quello. Grazie!
  • Re: Problema con lista ordinata

    Oddio... Ma come è possibile??? Se eseguo il tuo programma direttamente dal .exe, funziona. se lo eseguo da file sorgente, facendo compila ed esegui, crasha al primo inserimento O___O
    ma che..??????
  • Re: Problema con lista ordinata

    Fai un rebuild del programma. Sembra strano. A me in debug non va in crash.
  • Re: Problema con lista ordinata

    Ho ricopiato il tuo codice. funziona. Mamma mia mi sta facendo IMPAZZIRE sto diamine di devc++.
    Adesso me lo studio. Di nuovo grazie ! Se non capisco qualcosa chiedo a te
Devi accedere o registrarti per scrivere nel forum
12 risposte