Programma con coda

  • Autore discussione Utente cancellato 359755
  • Data d'inizio
U

Utente cancellato 359755

Ospite
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

Moderatore
Staff Forum
Utente Èlite
2,210
1,846
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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).
 
U

Utente cancellato 359755

Ospite
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:

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili