ADT Coda.

Introduzione

La Coda è un caso speciale di lista lineare, in cui le operazioni di inserimento e cancellazione avvengono ai due estremi della lista, la testa(top) e il fondo(bottom). Per questo spesso si indica la pila con il termine LIFO (Forst In First Out). Intuitivamente la coda è un gruppo di persone in attesa ad uno sportello. I nuovi arrivi si accodano mentre le persone vengono servite dalla testa.

Operazioni

Nota: con la realizzazione presentata sopra diventa ininfluente conoscere quale adt lista utilizzare. E' possibile anche utilizzare adt lista ricorsivo, implementando con esso una struttura dati imperativa.

Implementazione della Coda con un vettore circolare.

Tenendo conto che in una coda l'inserimento e l'estrazione avvengono da estremi opposti, possiamo sviluppare la coda con un array, utilizzando come cima della coda la testa dell'array, e come fondo l'altro estremo. Circolare significa che quando si giunge all'ultima posizione dell'array si ricomincia dalla prima.Si considererà piena o vuota la coda quando testa e fondo coincideranno.

Con questa idea si può sviluppare ADT coda nel seguente modo:

La struttura dati è la seguente:


	#define DIM 100
	typedef void* Elemento;
	typedef struct {
		void* ele[DIM];
		int testa, fondo;
	} _coda;
	
	typedef _coda *Coda;

Le due seguenti funzioni sono necessarie la prima per incrementare correttamente l'indice del vettore, la seconda per segnalare un uso scorretto della coda.


	static int piuuno( int i ) {
		return (i + 1) % DIM;
	}

	static fatal(char* x) {
		printf("\n%s\n", x);
		exit(-1);
	}

Le primitive sono:


	Coda codaCrea( void ) {
		Coda x = (Coda)malloc(sizeof( _coda ));
		x->testa =0; x->fondo = 1;
		return x;
	}

	Elemento codaFront( Coda c ) {
		if(codaEmpty(c)) fatal("ERRORE: front - coda vuota ");
		return c->ele[c->testa+1];
	}

	Coda codaEnqueue( Elemento e, Coda c ) {
		if( piuuno(c->fondo) == c->testa ) 
			fatal("ERRORE: enqueue - coda piena ");
		c->ele[c->fondo] = e;
		c->fondo = piuuno(c->fondo);
		return c;
	}

	Coda codaDequeue( Coda c) {
		if(codaEmpty(c)) fatal("ERRORE: dequeue - coda vuota ");
		c->testa = piuuno(c->testa);
		return c;
	}

	int codaEmpty( Coda c ) {
		return piuuno(c->testa) == c->fondo;
	}

Nota: