Programma con coda

Anghelo

Nuovo Utente
29
1
Salve, vado dritto al punto senza perdermi in inutili convenevoli. Sto studiando il tipo di dato CODA, ho capito che tipo di dato è, che si accede in modalità FIFO ecc, tuttavia nell'esempio che è riportato non riesco a comprendere come funzionano e che svolgono due sottoprogrammi, quindi per favore potreste spiegarmi cosa fanno? In particolare void insert e void remove. Grazie per l'aiuto
C:
int CodaPiena(int head, int tail) {
int piena=0;
if( ((tail+1)% MaxElem) ==head) piena=1; // coda su array circolare
return(piena);
}

void insert(int coda[], int head, int *tail, int elem) {
  if( CodaPiena(head, *tail)==1) {
   printf("La coda e' piena. Inserimento non effettuato.\n");
  }
  else {
  coda[*tail] = elem;
*tail=*tail+1;
  *tail= (*tail) % MaxElem; // implementazione ad array circolare
  }
}

int CodaVuota(int head, int tail) {
int vuota=0;
if( head==tail ) vuota = 1; // coda su arraycircolare
return(vuota);
}

void remove(int coda[], int *head, int tail, int *elem) {
if ( CodaVuota(*head, tail) == 1) {
printf("La coda e’ vuota. Rimozione non effettuato\n");
}
else {
*elem= coda[*head];
*head= *head+ 1;
*head= (*head)%MaxElem; }
}
 
Ultima modifica da un moderatore:

DispatchCode

Utente Attivo
692
427
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Internet
30Mbps/3Mbps con Eolo
Sistema Operativo
Windows 10 64bit
insert aggiunge un nuovo elemento alla coda e incrementa l'indice, chiamato tail. Questo è un parametro passato per riferimento; ha senso in effetti, in quanto se noti viene modificato dalla funzione stessa (incrementandolo).
Prima dell'inserimento viene fatto un check per verificare che la coda non sia già piena.

La funzione remove, in maniera analoga, rimuove un elemento dalla coda: trattandosi di una struttura FIFO, il primo elemento inserito nella coda è il primo ad essere rimossso.

Dallo spezzone di codice che hai mostrato si evince che head e tail siano due valori interi appunto, due indici, che puntano uno all'inizio della coda (dove si trova il primo elemento, per essere precisi) e uno alla fine (tail).

Non so come sia il resto del codice, ma diciamo che head = 0, e tail = 0, con una coda che può contenere 10 elementi.
Quando fai una insert l'elemento viene inserito nella posizione tail; subito dopo tail viene incrementato (essendo passato per riferimento, il valore cambia anche nella funzione chiamante).
Supponendo vengano inseriti altri 4 elementi (per un totale quindi di 5), e poi ne venga rimosso 1 dalla coda, ti troverai ad avere tail=5 e head = 1, in quanto viene rimosso coda[head], e viene quindi incrementato l'indice per "puntare" al prossimo elemento della coda (indice 1).
 

Anghelo

Nuovo Utente
29
1
Ok, adesso è un po' più chiaro, ti ringrazio molto. Ora visto che devo fare un esercizio nel quale devo usare una coda di stringhe, la funzione remove
C:
void rimuovi(nomi coda[], int *head, int tail, char *nometemp) {
if ( CodaVuota(*head, tail) == 1) {
printf("La coda e’ vuota. Rimozione non effettuato\n");
}
else {
strcpy(*nometemp, coda[*head]);
*head= *head+ 1;
*head= (*head) % nomi_max;
}
}
dovrebbe diventare così?

@DispatchCode perchè nel programma non mi funziona e lascia tutto invariato.
 
Ultima modifica da un moderatore:

Entra

oppure Accedi utilizzando

Discussioni Simili

Hot del momento