/* File: code.c */ /* Time-stamp: "2002-05-17 00:26:07 calvanes" */ /* Scopo: rappresentazione collegata delle code */ #include <stdlib.h> typedef int bool; /* Richiede di dichiarare il tipo degli elementi della coda */ /* typedef int TipoElemCoda; */ /* definizione del tipo lista */ struct nodoLista { TipoElemCoda info; struct nodoLista *next; }; typedef struct nodoLista NodoLista; typedef NodoLista *TipoLista; /* definizione del tipo coda */ struct tipoCoda { TipoLista primo, ultimo; }; typedef struct tipoCoda TipoCoda; /* implementazione delle operazioni primitive sulle code */ void InitCoda(TipoCoda *pc) /* Inizializza la coda *pc ponendo a NULL i puntatori al primo e all'ultimo elemento della coda. */ { (*pc).primo = NULL; (*pc).ultimo = NULL; } /* InitCoda */ bool TestCodaVuota(TipoCoda c) /* Restituisce TRUE se la coda c e' vuota, FALSE altrimenti. */ { return c.primo == NULL; } /* TestCodaVuota */ void InizioCoda(TipoCoda c, TipoElemCoda *pv) /* Restituisce in *pv il primo elemento della coda c senza modificare c. */ { if (c.primo == NULL) printf("ERRORE: elemento affiorante di coda vuota\n"); else *pv = c.primo->info; } /* InizioCoda */ void InCoda(TipoCoda *pc, TipoElemCoda v) /* Inserisce l'elemento v all'ultimo posto della coda c. */ { if (TestCodaVuota(*pc)) { /* *pc e` vuota: l'elemento da inserire sara` sia il primo che l'ultimo elemento della coda */ (*pc).primo = malloc(sizeof(NodoLista)); (*pc).ultimo = (*pc).primo; } else { (*pc).ultimo->next = malloc(sizeof(NodoLista)); (*pc).ultimo = (*pc).ultimo->next; } (*pc).ultimo->info = v; (*pc).ultimo->next = NULL; } /* InCoda */ void OutCoda(TipoCoda *pc, TipoElemCoda *pv) /* Elimina il primo nodo della coda *pc, restituendone il valore in *pv. */ { TipoLista paux; InizioCoda(*pc, pv); /* copia il valore del primo elemento di *pc in v (se esiste) */ if ((*pc).primo != NULL) { /* elimina il primo elemento di *pc */ paux = (*pc).primo; (*pc).primo = (*pc).primo->next; free(paux); } /* se l'elemento eliminato era l'unico elemento presente nella coda, allora si pone a NULL anche il puntatore all'ultimo elemento */ if ((*pc).primo == NULL) (*pc).ultimo = NULL; } /* OutCoda */