PDA

View Full Version : [c]implementare coda circolare


19spike83
26-04-2006, 14:22
salve ragazzi volevo chiedervi se qualcuno di voi avesse una coda circolare in c già implementata con funzioni, aggiungi alla coda , o rimuovi, grazie a tutti in anticipo.
Mi fareste davvero un gran piacere e risparmierei davvero molto tempo.

cionci
26-04-2006, 22:51
La cosa migliore sarebbe che tu la scrivessi da solo...altrimenti cosa impari ?

Comunque è semplici...ti posso dare qualche indizio...

Prendi un vettore di dimensione N...

Hai due indici...uno alla testa e uno alla coda...

A coda vuota gli indici puntano al primo elemento (elemento 0 del vettore)...

Per l'inserimento basta inserire l'elemento all'indice puntato dall'indice alla coda...ed incrementi l'indice...

Per l'estrazione, ritorni l'elemento puntato dall'indice alla testa ed incrementi l'indice che punta alla testa...

Lascio a te le condizioni di coda vuota o piena da verificare rispettivamente nell'estrazione e nell'inserimento (verifiche da fare prima di incrementare i rispettivi contatori)...

v1ruz
27-04-2006, 08:37
ma se si usa un vettore si crea una limitazione nella dimensione della coda..non e' meglio crearla dinamicamente?

cionci
27-04-2006, 09:31
Una coda circolare è storicamente limitata...altrimenti non può essere circolare...

v1ruz
27-04-2006, 18:26
ok. comunque si può anche implementarla dimamicamente

cionci
27-04-2006, 18:39
Mi puoi fare un esempio di coda circolare dinamica... Che senso ha farla circolare se è dinamica ? A meno che per dinamica tu non intenda con il vettore allocato dinamicamente...
Mi spiego meglio... Se la facessi dinamica non farei assolutamente una coda circolare, ma farei una lista e allocherei un nuovo nodo per ogni inserimento in coda e deallocherei il nodo dell'elemento estratto dalla testa... Non è una coda circoalre, ma è una normale coda...

19spike83
29-04-2006, 15:22
per quello che sò si può fare sia con un vettore ma è molto incasinato ci ho provato e non ce la faccio , poi la si può fare anke dinamicamente e quella l ho già fatta ma è meno veloce nell esecuzione.
mi servirebbe allocarla su un vetore di uno spazio fissato ,ho visto esempi in rete ma non in c.
ps non mi interessa molto imparare a fare queste cose le imparerò sul campo di battaglia a suo tempo come tutti quindi se ne avete una già fatta grazie per l aiuto.

cionci
29-04-2006, 15:27
Te l'ho spiegato sopra come farla con un vettore statico...

cionci
29-04-2006, 15:47
poi la si può fare anke dinamicamente e quella l ho già fatta ma è meno veloce nell esecuzione.
Forse intendi una lista linkata circolarmente ? Ma come dicevo ha poco senso a meno che gli elementi all'interno della lista siano sempre gli stessi (o che vengano inseriti ed estratti non molto frequentemente)... In tal caso potrebbe anche servire e con un semplice puntatore si potrebbe scorrere circolarmente tutti gli elementi...
Diciamo che l'informazione fondamentale delle strutture è diversa...la coda circolare è una comune coda dove l'informazione sta nell'inserimento e nella rimozione...il fatto che sia circolare è solo una conseguenza della rappresentazione stessa dei dati (cioè, se fosse possibile inserire in testa e rimuovere in coda senza dover sfruttare circolarmente il vettore non esisterebbe nemmeno)...mentre nella lista linkata circolarmente il fattore saliente sta nella circolarità, mentre l'inserimento e la rimozione sono solo un fattore accessorio...

Andlea
29-04-2006, 16:55
Una coda circolare dinamica non ha senso per definizione :mbe:

Realizzarla con i vettori statici è molto semplice, basta usare in modo furbo l'operatore % evitando controlli inutili

19spike83
30-04-2006, 11:12
già questa potrebbe essere un idea ma non ho capito come .....non è che potete spostare esempi??

Andlea
30-04-2006, 11:25
qualcosa del genere

void add(char* item)
{
items[tail] = item;
tail = (tail + 1) % count;
count++;
}
char* extract();
{
char* s = items[head];
head = (head + 1) % count;
count--;
retun s;
}