• Non ci sono risultati.

Implementazione di coda con array LE CODE Z F I CF C (F - - - )

N/A
N/A
Protected

Academic year: 2021

Condividi "Implementazione di coda con array LE CODE Z F I CF C (F - - - )"

Copied!
4
0
0

Testo completo

(1)

F ONDAMENTI DI I NFORMATICA C F RANCO Z AMBONELLI

LE CODE

2 Le Code in C

C ODA (F IRST - IN - FIRST - OUT )

La coda è una lista in cui:

• l'inserimento avviene ad una estremità (coda),

• mentre cancellazione e prelievo di dati avvengono all'altra estremità (testa).

Gli elementi vengono prelevati nello stesso ordine in cui sono stati inseriti.

Operazioni base su coda

descrizione intestazione delle funzioni in C

crea una coda vuota void CodaCrea(Coda *C);

inserisce un nuovo atomo in fondo

int CodaIn(Coda *C, Atomo A);

cancella l'atomo in testa int CodaOut(Coda *C, Atomo *A);

vero se la coda è vuota int CodaVuota(Coda *C);

Indice Analitico

Implementazione di coda con array

conviene memorizzare gli elementi in posizioni consecutive, ma non necessariamente a partire dalla prima

• quando la coda è stata appena creata, il primo inserimento avviene nella prima posizione

• gli inserimenti consecutivi di seguito, in posizioni verso destra

• le cancellazioni avverranno a partire dalla posizione 1 e via via opereranno su una posizione che si sposta verso destra

S crea un pacchetto di dati validi che si sposta verso destra.

Bisogna tenere traccia di due posizioni:

• primo elemento da estrarre

• del punto di inserimento

posizione MaxDim-1 posizione 0

primo:

cancella ed esamina qui

Ultimo inserito

Posizione di inserimento

4 Le Code in C

Gestione circolare di array

Quando la coda raggiunge l'ultima posizione dell’array, è necessario gestire l'array come se si trattasse di una struttura circolare:

• la posizione successiva a MaxDim-1 é 0.

0 MaxDi m-1 contiguità logic a

Si modifica il meccanismo di incremento di indice:

• PosizSucc = Posiz % MaxDim,

• genera la successione 0, 1, 2, ..., MaxDim-1, 0, 1, 2, ....

Inoltre:

• è necessario sapere quando la coda è piena o vuota.

• Se posizione del primo = posizione di inserimento la coda può essere sia piena che vuota

• Serve informazione supplementare vera quando la coda è vuota

(2)

Indice Analitico

/* CodeArr.h: coda implementata con array circolare */

/* Versione con accesso distruttivo

*/

#define CodaStatoPiena 2

#define CodaStatoVuota 1

#define CodaOK 0 typedef int Posiz;

typedef struct {

int Vuoto; /* vero quando coda vuota

*/

Posiz Primo, /* Posizione primo inserito */

Inser; /* Posizione del prossimo da inserire */

Atomo Dati[MaxDim];

} Coda;

extern void CodaCrea(Coda *C);

extern int CodaVuota(Coda *C);

extern Posiz Primo(Coda *C);

extern int CodaIn(Coda *C, Atomo A);

extern int CodaOut(Coda *C, Atomo *A);

extern char *CodaErrore ();

extern int CodaStato;/* variabile di stato */

6 Le Code in C

/* CodaArr.c */

#include "Infobase.h"

#include "CodaArr.h"

void CodaCrea(Coda *C){

C->Vuoto=1;

C->Primo=0;

C->Inser=0;

} /* end CodaCrea */

int CodaIn(Coda *C, Atomo A){

if ( (C->Inser==C->Primo) && (!(C->Vuoto))) CodaStato = CodaStatoPiena;

else {

CodaStato = CodaOK;

C->Dati[C->Inser] = A;

C->Inser = C->Inser%MaxDim;

C->Vuoto=0;

}

return CodaStato;

} /* end CodaIn */

Indice Analitico

int CodaOut(Coda *C, Atomo *A){

if (C->Vuoto)

CodaStato = CodaStatoVuota;

else {

CodaStato = CodaOK;

*A=C->Dati[C->Primo];

C->Primo = C->Primo%MaxDim;

if (C->Primo==C->Inser) C->Vuoto=1;

}

return CodaStato;

} /* end CodaOut */

int CodaVuota(Coda *C){ /* *C per economia */

return C->Vuoto;

} /* end CodaVuota */

char *CodaErrore (){

switch(CodaStato){

case CodaStatoVuota :

return "Errore: Coda vuota";

break;

case CodaStatoPiena :

return "Errore: Coda piena";

}

return "Variabile di stato errata";

} /* end CodaErrore */

Complessità computazionale delle operazioni di coda su array:

• costante (no cicli o ricorsioni!)

Si giustifica, vedendo la coda come un tipo particolare lista in cui inserimenti e le cancellazioni avvengono sempre a una estremità

8 Le Code in C

Implementazione di coda con puntatori

Struttura degli elementi è identica a quella della lista.

Sono inoltre necessari un puntatore al primo elemento e uno alla posizione di inserimento.

NON C’E’ LIMITE AL NUMERO DI ELEMENTI!!!

/* CodaPun.h */

#define CodaStatoVuota 1

#define CodaOK 0 typedef struct TCella{

struct TCella *Prox;

Atomo Dato;

}Cella;

typedef Cella *Posiz;

typedef struct{

Posiz Primo,Ultimo;

} Coda;

extern void CodaCrea(Coda *C);

extern int CodaVuota(Coda *C);

extern int CodaIn(Coda *C, Atomo A);

extern int CodaOut(Coda *C, Atomo *A);

extern char *CodaErrore ();

extern int CodaStato;

(3)

Indice Analitico

/* CodaPun.c */

#include "Infobase.h"

#include "CodaPun.h"

#include <stdlib.h>

int CodaStato=0;

/* CodaCrea */

void CodaCrea(Coda *C){

C->Primo=NULL;

C->Ultimo=NULL;

CodaStato = CodaOK;

} /* end CodaCrea */

/* CodaIn */

int CodaIn(Coda *C, Atomo A){

Posiz Temp;

CodaStato = CodaOK;

Temp=malloc(sizeof(Cella));

Temp->Dato = A;

Temp->Prox = NULL;

if (C->Ultimo==NULL) C->Primo = Temp;

else

C->Ultimo->Prox = Temp;

C->Ultimo = Temp;

return CodaStato;

} /* end CodaIn */

10 Le Code in C

/* CodaOut */

int CodaOut(Coda *C, Atomo *A){

Posiz Temp;

if (C->Primo==NULL)

CodaStato = CodaStatoVuota;

else {

Temp=C->Primo;

if (C->Primo==C->Ultimo) C->Ultimo=NULL;

C->Primo = C->Primo->Prox;

*A=Temp->Dato;

free(Temp);

CodaStato = CodaOK;

}

return CodaStato;

} /* end CodaOut */

/* CodaVuota */

int CodaVuota(Coda *C){ /* *C per economia */

return (C->Primo==NULL);

} /* end CodaVuota */

Complessitá computazionale: ancora costante!

Indice Analitico

Utilizzo della struttura dati Coda

Il seguente programma mostra un utilizzo della struttura coda, effettuando inserimenti ed estrazioni a comando.

Per il dato elementare, a scopo dimostrativo si utilizza un semplice intero (si può fare riferimento alla libreria InfoBase)

L'algoritmo del programma di prova è il seguente:

- inizializza la coda - ripeti

- prendi un comando da input - se il comando è

- inserimento - ripeti

- prendi un intero da input - inseriscilo

- in caso di insuccesso: messaggio di errore

finché l'intero è diverso da zero - estrazione

- estrai e mostra

- in caso di insuccesso: messaggio di errore

finché comando è diverso da fine

12 Le Code in C

#include "Infobase.h"

#include "CodaArr.h" /* Sostituibile con CodaPun.h */

#define Inserimento 'I'

#define Estrazione 'E'

#define Fine 'F' int main(){

Coda C;

Atomo A;

char Comando[80]; /* per contenere una intera

linea di Comando */

CodaCrea(&C);

(4)

Indice Analitico

do{

printf("Comando? ");

gets(Comando); /* carica la linea di comando,

considerando solo il primo carattere */

if (Comando[0]>='a') Comando[0]-=32;

/* converte in maiuscolo */

switch (Comando[0]){

case Inserimento : printf("inserimento\n");

do{

Acquisisci(&A);

if(!AtomoNullo(A))

if(CodaIn(&C,A)!=CodaOK) printf("coda piena\n");

} while(!AtomoNullo(A));

break;

case Estrazione : if (CodaOut(&C,&A)!=CodaOK)

printf("coda vuota\n");

else Visualizza(A);

break;

case Fine: break;

default : printf("Comando errato\n");

}

} while (Comando[0]!=Fine);

printf("Fine lavoro\n");

return 0;

}

Riferimenti

Documenti correlati

c) materiali di interesse marginale — materiali che costituiscono una distrazione per i suini ma che non dovrebbero essere considerati tali da soddisfare i loro

[r]

data una pila p ed un valore intero n, restituisca la nuova pila p' che contiene gli elementi della pila p di valore inferiore ad n, nello stesso ordine della pila

P er la prima volta il comune di Milano potrà avvalersi delle competenze e conoscenze di due medici veterinari come Garanti per la tutela degli animali. Paola Fossati e Gustavo

1973: UK, Irlanda e Danimarca entrano nell'UE Il governo inglese riteneva che fosse nel suo interessa far parte del processo di integrazione economica europea, in particolare per

E nonostante tutto cio' che sta accadendo ancora oggi, dopo un anno, penso che questa esprienza bruttissima ci cambierà tutti e che noi stiamo com- prendendo che

La Raccomandazione prevede che ciascuno Stato dell’Unione Europea, in base alle conoscenze scientifiche attuali, provveda affinché gli allevatori effettuino una

Il Covid ci ha spiegato con feroce determinazione e chiarezza che è il territorio e non l’ospedale che deve prima tracciare, argina- re e poi arrestare il contagio, i ri- coveri