Newsgroup: it.comp.programmare
Titolo: Implementazione coda

Salve,
vorrei sapere come posso scorrere la seguente lista in maniera FIFO. In 
maniera LIFO l'ho gia fatto:
#include <iostream>
struct Cella {
 int dato;
 Cella* prev;
};
Cella *first, *temp;
int main () {
 for (int i = 0; i < 5; i++) {
  temp = first;
  first = new Cella();
  first->dato = i;
  first->prev = temp;
 };
 // Estrazione in modalita' LIFO (pila)
 while (first != 0) {
    temp = first;
    std::cout << first->dato << std::endl;
    first = first->prev;
   delete temp;
 };
 while (std::cin.get() != '\n');
 return 0;
}
Grazie

 
a che pro tutto cio??
l'implentazionendi strutture fifo o lifo o quel che ti pare, prevedono di
poter in ugmi momento inserire e camncellare (push e pop) un elemento
dalla struttura.
tu invece puoi solo inserirli ee eliminarli tutti in una volta sola.
fatti una funzione pop()e una push() che vogliono in ingresso puntatore a
testa e uno a coda della lista  

 testa e uno a coda della lista
Semplicemente volevo vedere con che codice potevo scorrere in maniera fifo i 
valori inseriti nella lista.
O per caso in una lista formata da celle singolarmente collegate č possibile 
scorrere solo nel senso opposto (lifo)?
Per caso hai libri di algoritmi e strutture dati da consigliare? Vorrei 
imparare a scrivere strutture di questo tipo ma anche piů complesse... ho 
sempre pensato che la programmazione dinamica (e quella ricorsiva) sia la 
piů difficile, mi piacerebbe trovare un testo "illuminante" in materia, 
anche se devo dire che non mi ci sono mai messo seriamente a studiare tali 
argomenti.
Grazie 

 argomenti.
l'uso dei puntatori č considerato un fondamentale della programmazione
in c,  qualsiasi testo base dovrebbe contenere tutti gli algoritmi di
gestione liste / alberi e quant'altro. In rete trovi materiale a bizzeffe,
google ti č amico.
ciao

 Grazie
Ad ogni modo, questa cosa che hai scritto a che serve?
Se devi costruire una coda devi creare due metodi, uno per inserire un 
elemento nella coda e uno per estrarlo.
Poi nel tuo test utilizzi i due metodi per inserire e prelevare gli 
elementi.
Per esempio, una volta definiti i due metodi inserisci() e recupera()
poi puoi scrivere un codice del tipo
	...
	lista.inserisci(3);
	lista.inserisci(7);
	std::cout lista.recupera(); //deve scrivere 3
	lista.inserisci(12);
	std::cout lista.recupera(); //deve scrivere 7
	std::cout lista.recupera(); //deve scrivere 12
	...

 elemento nella coda e uno per estrarlo.
No, voglio solo inserire e stampare gli elementi scorrendo la lista tramite 
puntatori.
Ciao 

 puntatori.
A che serve una cosa fine a se stessa?
Pensavo che volevi definire una bozza di lista LIFO per poi utilizzarla 
in qualcosa di concreto.
Cosi' non ha alcun senso: tanto vale usare un array.

 qualcosa di concreto.
No. Ho detto chiaramente fin da subito che volevo sapere quale codice usare 
per ottenere un meccanismo FIFO dato che il LIFO lo avevo scritto già.
Ciao 

 Ciao
Ciao.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 dell'esecuzione di un comando?
E' una delle tante "ficiur" di windows. Se lanci un programma dos 
dall'ambiente grafico, windows apre una finestra dos, esegue il 
programma, e chiude la finestra dos appena il programma termina ;) 

Nurax ha scritto:

Boh. A parte il fatto che puoi andare nelle proprieta' dell'eseguibile e 
togliere la spunta a "chiudi all'uscita", perche' non lo lanci dalla 
finestra dell'interprete di comandi cosi' puoi anche passargli piu' 
comodamente eventuali parametri, ridirigere l'output, etc.?

 Altrimenti tanto vale usare un array.
Allora. Io volevo solo scorrere la pila in modalita lifo e fifo, lifo l'ho 
fatto mi serviva solo fifo. Non ho bisogno di provare inserimenti, 
estrazioni o modifiche varie... non mi pare difficile da capire. E' un 
semplice codice d'esempio, non deve essere integrato in qualche libreria per 
la gestione di strutture dati dinamiche...
Ciao 

 comodamente eventuali parametri, ridirigere l'output, etc.?
Ma cosa ci vuole a capire che quello era solo un'esempio e la prompt che si 
chiude non è un problema dato che uso la richesta dell'invio? Se ho bisogno 
di testare programmi che richiedono l'uso di paramentri allora apriro la 
shell ed eseguiro da li. 

 Grazie
Hai bisogno di una struttura dati ausiliaria che ti consenta
di ricostruire l'ordine inverso.
Puoi aggiungere un campo Next a Cella in modo che ogni
nodo Cella abbia un puntatore al nodo precedente e uno
al successivo. In questo caso scorrere la lista dal fondo
alla testa e' molto simile a scorrerla dalla testa alla
coda.
Se non puoi/vuoi modificare Cella allora puoi costruire una
lista "parallela" alla prima in cui l'ordine dei nodi e'
l'inverso della lista principale.
Infine puoi usare come struttura ausiliaria lo stack ,
usando cioe' una funzione ricorsiva:
// pseudo-codice. A te l'esercizio di tradurlo in C
ScorriLista( First ):
   if First != NULL:
     ScorriLista( First.Prev )
     print First.dato
ciao
Giacomo


-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.


