[C++] funzione put di una coda
Ciao a tutti,
volevo fare una domanda sulla funzione di inserimento di una coda implementata tramite array:
La funzione put:
Mi è tutto chiaro, eccetto l'ultima riga
Quel simbolo non è il resto della divisione?
Che senso ha fare questo?
Non basta incrementare la tail?
volevo fare una domanda sulla funzione di inserimento di una coda implementata tramite array:
struct TipoCoda[ int N; int dim; int head; int tail; int *s; //vettore contenente elementi };
La funzione put:
void put(TipoCoda *p, int x){ if(codaIsFull(p)){ cout<<"coda piena"; }else{ p->N++; p->s[p->tail] = x; p->tail = (p->tail + 1) % (p->dim);
Mi è tutto chiaro, eccetto l'ultima riga
p->tail = (p->tail + 1) % (p->dim);
Quel simbolo non è il resto della divisione?
Che senso ha fare questo?
Non basta incrementare la tail?
Risposte
Ha lo scopo di mandare a 0 tail nel caso in cui tail+1 = dim. Serve affinché la coda continua a ciclare su se stessa.
"vict85":
Ha lo scopo di mandare a 0 tail nel caso in cui tail+1 = dim. Serve affinché la coda continua a ciclare su se stessa.
Ma metti che ho tail a 0, e dim =5, facendo
p->tail = (p->tail + 1) % (p->dim);
è come assegnare alla coda il valore 1%5 che è uguale a 2 no? Invece deve andare a 1 la tail..
Perché 1%5 è uguale a 2? 1%5 è uguale a 1.
"vict85":
Perché 1%5 è uguale a 2? 1%5 è uguale a 1.
Si -.- vero! Perfetto, però che senso ha l'array circolare, una volta riempita la pila non posso mica continuare ad inserire..
non capisco il ragionamento!
Quando elimini degli elementi dalla testa della coda fai spazio all'inizio che puoi poi riempire quando la coda della coda raggiunge la fine e ricomincia da capo..
Supponi di avere una coda reale di persone e dai un numero ad ogni persona che arriva. Una volta arrivato a dim ricominci a dare i biglietti da 1. Tu stai facendo la stessa cosa.
Ma la head non è sempre in posizione 0 quindi? Se estraggo un elemento la head va incrementata?
Certo.. Se head fosse sempre a zero non avresti neanche bisogno di memorizzare il suo valore..
vero.. ma non era più semplice tenere fisso head e ad ogni estrazione fare head --!
Comunque grazie 1000 ragazzi
Comunque grazie 1000 ragazzi

Non ho capito la tua idea.. Che cosa intendi dire con "fare head --"? Una volta che elimini la testa, il nuovo elemento che deve diventare quello di testa è il vecchio secondo elemento e quindi quello con indice (head+1) % (p->dim).
Nel senso di mantenere la head sempre in posizione zero, magari trasformandola in un puntatore alla pila, e quando elimino un elemento faccio puntare la head all' elemento che prima era al secondo posto.. ma pensandoci bene non ha senso perchè sto implementando la pila con array, non tramite lista
"Oo.tania":
Nel senso di mantenere la head sempre in posizione zero, magari trasformandola in un puntatore alla pila, e quando elimino un elemento faccio puntare la head all' elemento che prima era al secondo posto.. ma pensandoci bene non ha senso perchè sto implementando la pila con array, non tramite lista
Senza considerare che farlo con una lista significa rallentare notevolmente il programma.
Uffa è sorto un altro problema: il main è così strutturato:
Il numero massimo di elementi è 5, e se decido di inserire 5 elementi non stampa, ma perchè??
la funzione stampa:
la funzione put:
è come se questa condizione nel ciclo while della funzione stampa
si verificasse subito..
#include <cstdlib> #include <iostream> #include "codarray.h" #define NELEM 5 using namespace std; int main(int argc, char *argv[]) { int x,i=0,dim; Codaptr C1= new Coda(NELEM); cout<<"Quanti elementi vuoi inserire?"; cin>>dim; if(dim>NELEM){ cout<<"Errore, la coda puo' contenere al massimo "<<NELEM<<" elementi"<<endl; }else{ while(i<dim){ cout<<"Inserire:"; cin>>x; put (C1,x); i++;} } Stampa(C1); system("PAUSE"); return EXIT_SUCCESS; }
Il numero massimo di elementi è 5, e se decido di inserire 5 elementi non stampa, ma perchè??
la funzione stampa:
void Stampa(Codaptr p){ int i; if(CodaIsEmpty(p)){ cout<<"la coda e' vuota"<<endl; }else{ i = p->head; while(i != p->tail){ cout<<i<<"->["<<p->s[i]<<"] "; i=++i % (p->dim); } cout<<endl; } }
la funzione put:
void put(Codaptr p, int x){ if(CodaIsFull(p)){ cout<<"La coda e' piena"<<endl; }else{ p->N++; p->s[p->tail]=x; p->tail=(p->tail+1) % (p->dim);} }
è come se questa condizione nel ciclo while della funzione stampa
while(i != p->tail)
si verificasse subito..
E infatti è esattamente quello che succede.. Ti consiglio di dare una occhiata ad esempio sul sito di wikipedia (inglese - non ho guardato quella italiana). Ad un certo punto discute questo problema e mostra alcune soluzioni possibili. Personalmente quello che preferisco è quello di contare il numero di valori scritti e quello dei valori letti come valori assoluti invece che usare i puntatori. La più semplice è probabilmente quella di lasciare sempre almeno un elemento vuoto nell'array.
