c e c++, qualcuno mi aiuta con le liste ordinate?

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
kdekda
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 29 marzo 2007, 17:45

c e c++, qualcuno mi aiuta con le liste ordinate?

Messaggio da kdekda »

ciao ragazzi..qualcuno conosce un po di c/c++ e magari mi da una mano? ho una lista dinamica e devo fare l'inserimento ordinato..però nisba,non va.. (ps purtroppo senza prog a oggetti)
ecco il codice di quello che ho scritto: in pratica io chiedo i dati poi chiamo la funzione ins_ord passandogli come argomento i dati da inserire e la testa della lista..

Codice: Seleziona tutto

int ins_ordinato(NODO * &head,char nome[],char albumname[],int year,float prez,traccia trackname[],int ntracce) //sono i dati di un album musicale
                                                                             //il tipo traccia è semplicemente un vettore di caratteri
  {
     NODO *t;
     NODO *p;
     NODO *prec;
     int i;
                     
     t= new NODO;
                     
     if (t== NULL)
     {
      cout<<"Memoria esaurita"<<endl;
      return 1;
     }
     strcpy (t->disco.alias,nome);
     strcpy (t->disco.nome_album, albumname);
     t->disco.n=ntracce;
     t->disco.prezzo=prez;
     t->disco.anno=year;
     for (i=0;i<ntracce;i++)
     {
       strcpy(t->disco.nome_traccia[i],trackname[i]);
     }
     
     
     //verifica della presenza di elementi nella lista
     
     if (head == NULL);
        {
          head=t;
          t->next=NULL;
          return 0;
        }
     //lista non vuota
               
     //cambio della testa 
     
               
     if ( strcmp(albumname, head->disco.nome_album)<0)
        {
          t->next= head;
          head=t;
          return 0;
        }
        
       /* se 2 dischi hanno lo stesso nome controlla l'autore: se è lo
         stesso segnala l'eventuale doppione, altrimenti li
         ordina in base al nome dell'autore*/
         
      if (  strcmp(albumname, head->disco.nome_album)==0)
        {
        
               
               if (strcmp(nome,t->disco.alias)==0)
                 {
                   delete t;
                   cout<< " Dati già inseriti"<<endl;        
                   return 0;
                 }
               if (strcmp(nome,t->disco.alias)<0)
                 {
                   t->next=p;
                   prec->next=t;
                   return 0;
                 }
          
         }
      
      // se la lista contiene un solo elemento
      if (head->next==NULL)
      {
        head->next=t;
        t->next=NULL;
        return 0;
      }
      
      //lista con più elementi
      prec=head;
      p=head->next;
      while (p!=NULL)
      {
        if (strcmp(albumname, p->disco.nome_album)<0)
        {
          t->next=p;
          prec->next=t;
          return 0;
        }
        /* se 2 dischi hanno lo stesso nome controlla l'autore: se è lo
         stesso segnala l'eventuale doppione, altrimenti li
         ordina in base al nome dell'autore*/
        if ( strcmp(albumname, p->disco.nome_album)==0)
        {
          
               if (strcmp(nome,t->disco.alias)==0)
                 {
                   delete t;
                   cout<< " Dati già inseriti"<<endl;        
                   return 0;
                 }
               if (strcmp(nome,t->disco.alias)<0)
                 {
                   t->next=p;
                   prec->next=t;
                   return 0;
                 }
            
        } 
        
        p=p->next;
        prec=prec->next;
      }
      prec->next=t;
      t->next= NULL;
      return 0;
  }
qualcuno trova l'errore?il dev(ebbene si, uso il devo sotto win, spero non ne abbiate a male :-[) compila tutto, per cui non mi suggerisce nulla..
grazie a tutti in ogni caso..
Ultima modifica di kdekda il sabato 23 giugno 2007, 12:11, modificato 1 volta in totale.
Dell Inspiron 1520, nvidia 8600 256 mb, 3 gb ram
kubuntu 10.10 a 32 bit
KDE 4.6
Avatar utente
ubuntu_of_fortune
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 415
Iscrizione: venerdì 4 maggio 2007, 23:07

Re: c e c++, qualcuno lo conosce??

Messaggio da ubuntu_of_fortune »

Dunque, purtroppo ho provata a dare una rapida occhiata al codice ma e' davvero lunghissimo per quello che devi fare.. potresti farlo in maniera molto piu' compatta e pulita..

Comunque, ognuno ha i suoi modi ;) non ti preoccupare.. quello che volevo dirti e' che se compila [usa gcc da terminale ti prego :) ]
il problema e' semantico..

Quello che volevo suggerirti e':
perche' non ripensi un momento all'algoritmo e lo modularizzi un pochino..
magari invece che fare un inserimento ordinato, perche' non pensi ad un inserimento e poi ad un ordinamento (con eventuale eliminazione delle ripetizioni)..

Non so se ti intendi di complessita', ma e' piu'efficiente (asintoticamente sia chiaro) !! :)
Ovviamente l'inserimento per farlo piu' efficiente lo fai sempre in testa!
E' solo un'idea a volo! Ora come ti dicevo vado di fretta ma appena posso ti prometto che guardo il codice e ti suggerisco una alternativa ;)
Ciao ha tt sn nuovo dl forum.... o appena installato leenux ma dv s trova 1 pulsante start????? 
~ Bimbominkia su forum di Linux
kdekda
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 29 marzo 2007, 17:45

Re: c e c++, qualcuno mi aiuta con le liste ordinate?

Messaggio da kdekda »

grazie per la risposta ubuntu_of_fortune...
l'ho rifatto da capo..ecco qui

Codice: Seleziona tutto

int ins_ordinatoalb(NODALB * &head,char nome[],char albumname[],int year,
                    float prez,traccia trackname[],int ntracce){
	// scorro per trovare la posizione adatta;
	NODALB *q = NULL;
	NODALB *p = head;
	NODALB *t;
	int i;
	while(p!= NULL && (strcmp(p->disco.nome_album,albumname)<0) )
    {
		q = p;
		p = p->next;
	}
	 t = new NODALB;
	 strcpy (t->disco.alias,nome);
     strcpy (t->disco.nome_album, albumname);
     t->disco.n=ntracce;
     t->disco.prezzo=prez;
     t->disco.anno=year;
     for (i=0;i<ntracce;i++)
     {
       strcpy(t->disco.nome_traccia[i],trackname[i]);
     }
	
	// controllo se va in prima posizione
	if (q == NULL)
    {
		// va in prima posizione
		head = t;
		t->next = p;
        return 0;			
	} 
	
    else
    {
		// va tra p e q
		q->next = t;
		t->next = p;
		return 0;
}
}
Ora ordina perfettamente. Non so però come fare a stabilire un secondo criterio di ordinamento nel caso in cui 2 album abbiano lo stesso nome( volevo ordinarli in base all'anno di uscita)..qualche suggerimento? ciao
Dell Inspiron 1520, nvidia 8600 256 mb, 3 gb ram
kubuntu 10.10 a 32 bit
KDE 4.6
Avatar utente
menelicte
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 596
Iscrizione: lunedì 4 giugno 2007, 0:04

Re: c e c++, qualcuno mi aiuta con le liste ordinate?

Messaggio da menelicte »

io metterei qualcosa del genere:

Codice: Seleziona tutto

	while(p!= NULL && (strcmp(p->disco.nome_album,albumname)<0) )
       {
		q = p;
		p = p->next;
	}
 //       if (p!= NULL && (strcmp(p->disco.nome_album,albumname)=0) 
		while(p!= NULL && (strcmp(p->disco.nome_album,albumname)=0) && p->disco.anno<year) )
       		{
			q = p;
			p = p->next;
		}
[EDIT] l'if è ridondante: l'ho commentato
Ultima modifica di menelicte il domenica 24 giugno 2007, 0:04, modificato 1 volta in totale.
"Tentare è il primo passo verso il fallimento" Homer J.
Avatar utente
Uno
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 412
Iscrizione: sabato 3 marzo 2007, 21:47
Contatti:

Re: c e c++, qualcuno mi aiuta con le liste ordinate?

Messaggio da Uno »

kdekda ha scritto: ciao ragazzi..qualcuno conosce un po di c/c++ e magari mi da una mano?
Io ti consiglio di fare il tutto in C++ seguendo il paradigma della programmazione a oggetti, crei una classe per le liste ordinate e poi ne scrivi i vari metodi nel modo più generico possibile. ;)
Ultima modifica di Uno il lunedì 25 giugno 2007, 11:11, modificato 1 volta in totale.
porco diodo...
kdekda
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 351
Iscrizione: giovedì 29 marzo 2007, 17:45

Re: c e c++, qualcuno mi aiuta con le liste ordinate?

Messaggio da kdekda »

grazie per i suggerimenti, oggi provo..
Uno ha scritto: Io ti consiglio di fare il tutto in C seguendo il paradigma della programmazione a oggetti, crei una classe per le liste ordinate e poi ne scrivi i vari metodi nel modo più generico possibile. ;)
è qui il difficile...non posso usare la programmazione ad oggetti..non sono più capace...
Dell Inspiron 1520, nvidia 8600 256 mb, 3 gb ram
kubuntu 10.10 a 32 bit
KDE 4.6
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti