Newsgroup: it.comp.os.linux.development
Titolo: Riscrivere un ciclo in C

Salve a tutti,
E' da poco che ho iniziato a studiare il C e mi sto scontrando con i
primi grosso ostacoli.
Vorrei chiedervi questo, devo eliminare un record all'interno di una
lista e di solito uso un ciclo while del seguente tipo per tenere
traccia del record corrente (da eliminare) e di quello precedente
msg *cursore=lista;
//lista e' una struct di tipo
// struct messaggio{...}msg;
//piena di record
msg *prec=NULL;
while(cursore->nextPtr!=NULL && (e' falsa una certa condizione)){
  prec=cursore;
  cursore=cursore->nextPtr;
}
e qui uso i due puntatori per eliminare il record.
Come faccio a tradurre il ciclo while in un ciclo formantenendo le
stesse funzionalita'??
Grazie per l'aiuto!
Filippo

 ha scritto nel messaggio
news:1115737116.9...@f14g2000cwb.googlegroups.com...


Io la cambierei un poco...
for ( cursore=lista, prec=NULL;
      cursore!=NULL;
      prec=cursore, cursore=cursore->nextPtr ) {
  if ( condizione ) break;
}
Per tre ragioni:
1) se - in ingresso - lista e` NULL, non usa NULL->nextPtr (crash!)
2) in uscita, (cursore == NULL) equivale a (!condizione) e quindi sai
   esattamente come mai il ciclo e` finito
   if ( cursore != NULL ) {
      /* trovato, prec punta al precedente (o a NULL) */
   } else {
      /* non trovato */
   }
3) tutte le operazioni di gestione lista sono concentrate su una linea
   e questa e` inclusa nel for (cosmetica, ma talvolta aiuta...)
   Ho anche visto fare cursore=(prec = cursore)->next ma non mi piace
   tanto come stile...
   Inoltre la condizione e` nel corpo del corpo del for e questo rende
   possibile dei test complessi senza dover dichiarare funzioni extra.
Ciao,
  -- Roberto


Grazie ragazzi!
Ora ho le idee molto piu' chiare! La gestione delle liste non e'
proprio intuitiva e  purtroppo non ho trovato esempi esaustivi, così
mi do' alla sperimentazione :)
Grazie ancora 
Filippo

 stesse funzionalita'??
for (; cursore->nextPtr ;)
Se qualcuno ti obbliga a farlo per esercizio é un conto, altrimenti prenditi
una lista già fatta e datti a qualcosa di più produttivo.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! I Never Wanted To Be What They Told Me To Be
  		Fulfill My Fate Then I'll Be Free >!- Blind Guardian - Mordred's Song

 una lista già fatta e datti a qualcosa di più produttivo.
Scusa ma non ho capito il senso di "piu' produttivo". Se non riesco a
padroneggiare questi concetti come faro' ad essere anche minimamente
produttivo?
Ciao Filippo

Forse non ho ancora le idee così chiare...
ho provato il seguente ciclo
i=0;
for(cur=lista;cur!=NULL;prec=cur,cur=cur->nextPtr){
       if(strcmp(cur->destinatario,utente)==0){
		printf("\n%d",i);
		printf("\nPrec: %s",prec->oggetto);
		printf("\nCur: %s",cur->oggetto);
	}
i++;
}
ma l'applicazione va in segmentation fault!
L'unico modo per farla andare e' eliminando la printf che contiene
prec->oggetto oppure mettendo la IF all'interno di un'altra IF con
condizione (i>1). Praticamente al primo ciclo prec sembrerebbe non
piacergli...
Avete consigli??
Grazie 
Filippo

 Forse non ho ancora le idee cosě chiare...
Concordo.

Stiamo andando parecchio OT, per favore spostati su un gruppo piu`
appropriato (.iniziare o .lang.c). Comunque, visto che siamo in ballo...
man gdb
P.S. Che valore pensi che prec abbia quando i == 0?
Ciao,
-- 
       Roberto Divia`              Love at first sight is one of the greatest
Dep:PH Bat:53 Mailbox:C02110      labour-saving devices the world has ever seen
Route de Meyrin 385               ---------------------------------------------
Case Postale                                Phone:  
+41-22-767-4994
CH-1211 Geneve 23 CERN                      Fax:    
+41-22-767-9585
Switzerland                                 E-Mail: 
Robert...@cern.ch

 produttivo?
Certo, ma non metterti a riinventare la ruota. Appena hai capito non starci
su più dello stretto necessario. Io non saprei scrivere una map così su due
piedi e non ho rimorsi di coscienza.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.yoda2000.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Computer programmers never die, they just get lost in the processing. !>-