/* File: codeseq.c */ /* Time-stamp: "2002-05-17 00:26:58 calvanes" */ /* Scopo: rappresentazione sequenziale delle code */ typedef int bool; #define MaxCoda 10 /* Richiede di dichiarare il tipo degli elementi della coda */ /* typedef int TipoElemCoda; */ /* definizione del tipo coda */ struct tipoCoda { TipoElemCoda coda[MaxCoda]; int primo, ultimo; }; typedef struct tipoCoda TipoCoda; /* implementazione delle operazioni primitive sulle code */ void InitCoda(TipoCoda *pc) /* Inizializza la coda *pc ponendo a -1 gli indici al primo e all'ultimo elemento della coda. */ { (*pc).primo = -1; (*pc).ultimo = -1; } /* InitCoda */ bool TestCodaVuota(TipoCoda c) /* Restituisce TRUE se la coda c e' vuota, FALSE altrimenti. */ { return (c.primo == -1); } /* TestCodaVuota */ void InizioCoda(TipoCoda c, TipoElemCoda *pv) /* Restituisce in *pv il primo elemento della coda c senza modificare c. */ { if (TestCodaVuota(c)) printf("ERRORE: CODA VUOTA\n"); else *pv = c.coda[c.primo]; } /* InizioCoda */ bool TestCodaPiena(TipoCoda c) /* Restituisce TRUE se la coda c e` piena, FALSE altrimenti. */ { return ((c.primo - c.ultimo == 1) || ((c.ultimo - c.primo) == (MaxCoda-1))); } /* TestCodaPiena */ void InCoda(TipoCoda *pc, TipoElemCoda v) /* Inserisce l'elemento v all'ultimo posto della coda *pc. */ { if (TestCodaPiena(*pc)) printf("ERRORE: CODA PIENA\n"); else { /* posizionamento indice ultimo alla prossima posizione libera */ if ((*pc).primo == -1) { /* coda vuota: l'elemento da inserire sara` sia il primo che l'ultimo elemento della coda */ (*pc).ultimo = 0; (*pc).primo = 0; } else /* coda non vuota: cambia solo il puntatore all'ultimo elemento */ (*pc).ultimo = ((*pc).ultimo + 1) % MaxCoda; /* assegnazione di v all'ultimo elemento della coda */ (*pc).coda[(*pc).ultimo] = v; } } /* InCoda */ void OutCoda(TipoCoda *pc, TipoElemCoda *pv) /* Elimina il primo elemento della coda *pc, restituendone il valore in *pv. */ { if (TestCodaVuota(*pc)) printf("ERRORE: CODA VUOTA\n"); else { *pv = (*pc).coda[(*pc).primo]; /* se l'elemento eliminato era l'unico elemento presente nella coda, allora si pone a -1 anche il puntatore all'ultimo elemento */ if ((*pc).primo == (*pc).ultimo) { (*pc).ultimo = -1; (*pc).primo = -1; } else /* coda non vuota: cambia solo il puntatore al primo elemento */ (*pc).primo = ((*pc).primo + 1) % MaxCoda; } } /* OutCoda */