Anteprima
Vedrai una selezione di 3 pagine su 10
Fondamenti di programmazione - Algoritmi Pag. 1 Fondamenti di programmazione - Algoritmi Pag. 2
Anteprima di 3 pagg. su 10.
Scarica il documento per vederlo tutto.
Fondamenti di programmazione - Algoritmi Pag. 6
1 su 10
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

LISTA SEQUENZIALE

struct list{

float*buffer;

int size;

int head;

int tail;

}; 1. Inizializzazione:

void init(struct list*ptr,int dimension){

ptr->size=dimension;

ptr->head=0;

ptr->tail=0;

ptr->buffer=(float*)malloc(sizeof(float)*dimension);

}

2. Inserimento in coda:

boolean suf_insert(struct list*ptr,float value){

boolean success=FALSE;

if ( (ptr->head) != (ptr->tail+1)%(ptr->size) ){ //controllo lista non piena

ptr->buffer[ptr->tail]=value; //inserisce in tail

ptr->tail=(ptr->tail+1)%(ptr->size); //incrementa tail

success=TRUE;

}

return success;

}

3. Inserimento in testa:

boolean pre_insert(struct list*ptr,float value){

boolean success=FALSE;

if( (ptr->head) != (ptr->tail+1)%(ptr->size) ){//controllo lista non piena

ptr->head=((ptr->head)+(ptr->size-1))%(ptr->size); //decrementa head

ptr->buffer[ptr->head]=value; //inserisce in head

success=TRUE;

}

return succsess;

}

4. Cancellazione in testa:

boolean pre_delete(struct list*ptr,float*value){

boolean success=FALSE;

if (ptr->head != ptr->tail){ //controllo lista non vuota

*value=ptr->buffer[ptr->head]; //assegna a value il valore in head

ptr->head=(ptr->head+1)%(ptr->size); //incrementa head

success=TRUE;

}

return success;

}

5. Visita di stampa:

void visit(struct list*ptr);

int position;

for (position=(ptr->head); position != (ptr->tail); (position+1)%(ptr->size)){

//scorre indice position da head a tail-1

printf(“%f”,ptr->buffer[position]); //stampa elemento in posizione position

}

}

6. Ricerca:

boolean search(struct list*ptr,float value){

boolean found=FALSE; //inizializza found

int position=(ptr->head); //inizializza position

while ( position != (ptr->tail) && found==FALSE){ //finché position non arriva

alla fine e found è falso itera

if (is_equal(ptr->buffer[position],value)) found=TRUE; //confronto

else position=position+1%(ptr->size); //incrementa position se non

} trova elemento

return found;

}

LISTA COLLEGATA CON PUNTATORI

struct list{

float value;

struct list*next_ptr;

}; 1) Inizializzazione:

void init(struct list**ptrptr){ //la lista vuota è composta da un puntatore a NULL

*ptrptr=NULL;

}

2) Inserimento in testa: //non fallisce a meno di memoria insufficiente

void pre_insert(struct list**ptrptr,float value){

struct list*tmp;

tmp=*ptrptr; //assegna a tmp indirizzo prossimo elemento

*ptrptr=(struct list*)malloc(size of(struct list)); //alloca nuovo elemento

(*ptrptr)->value=value; //assegna valore

(*ptrptr)->next_ptr=tmp; //assegna al puntatore del nuovo elemento

} l'indirizzo del prossimo elemento

3) Inserimento in coda: //non fallisce a meno di memoria insufficiente

void suf_insert(struct list**ptrptr,float value){

while( *ptrptr != NULL ){ //avanza ptrptr finché non punta a NULL

ptrptr=&((*ptrptr)->next_ptr); //infatti associa a ptrptr l'indirizzo di next_ptr

}

pre_insert(ptrptr,value);

}

4) Ricerca:

boolean search(strcut list*ptr,float value,struct list**target_ptr){

boolen found=FALSE; //inizializza found a FALSE

while(ptr != NULL && found==FALSE){ //itera fino a fine lista o elemento trovato

if(is_equal(ptr->value,value)){ //confronto

found=TRUE; //imposta found a TRUE se trova elemento

*target_ptr=ptr; //target_ptr punta all'elemento

} contenente il valore cercato

else ptr=ptr->next_ptr; //altrimenti scorre ptr

}

return found;

}

5) Ricerca in lista ordinata: //ipotizza lista con valori ordinati in modo crescente

boolean ord_search(struct list*ptr,float value,struct list**target_ptr){

boolean found=FALSE;

while( ptr != NULL && found==FALSE && (ptr->value)<=value ){

if( is_equal(ptr->value,value )){

found=TRUE;

*target_ptr=ptr;

}

else ptr=ptr->next_ptr;

}

return found;

}

6) Cancellazione in testa: //fallisce per lista vuota,restituisce valore elemento eliminato

boolean consume_first(struct list**ptrptr, float*value_ptr){

boolean success=FALSE;

struct list*tmp;

if (*ptrptr != NULL){ //lista non vuota

tmp=*ptrptr; //assegna a tmp indirizzo dell'elemento da cancellare

*ptrptr=(*ptrptr)->next_ptr; //assegna a ptrptr indirizzo elemento successivo

*value_ptr=tmp->value; //assegna a value_ptr valore elemento da cancellare

free(tmp); //libera l'elemento puntato da tmp

success=TRUE;

}

return success;

}

7) Clonazione di una lista:

void clone(struct list*src_ptr,struct list**dst_ptr){

init(dst_ptr); //inizializza lista destinazione

while(src_ptr != NULL){ //itera fino alla fine della lista sorgente

suf_insert(dst_ptr, (src_ptr->value)); //inserisce elemento da src in coda a dst

dst_ptr=&((*dst_ptr)->next_ptr); //scorre dst_ptr

src_ptr=src_ptr->next_ptr; //scorre src_ptr

}

8) Visita:

void visit(struct list*ptr){

while(ptr != NULL){ //itera fino a fine lista

printf(“%f”,ptr->value); //stampa valore elemento puntato

ptr=ptr->next_ptr; //scorre ptr

}

}

9) Somma elementi lista:

void sum(struct list*ptr,float*sum){

*sum=0; //inizializza sum a 0

while(ptr!=NULL){ //itera fino a fine lista

*sum+=ptr->value; //sum= sum+(valore elemento corrente)

ptr=ptr->next_ptr; //incrementa ptr

}

}

FORME RICORSIVE

1) Visita ricorsiva:

void visit_r(struct list*ptr){

if(ptr != NULL){ //guardia (consente arresto iterazione)

printf(“%f”,ptr->value); //stampa valore elemento corrente

visit_r(ptr->next_ptr); //chiama se stessa incrementando ptr

}

}

2) Inserimento in coda ricorsivo:

void suf_insert_r(struct list**ptrptr,float value){

if(*ptrptr != NULL){ //guardia

suf_insert_r(&((*ptrptr)->next-ptr),value); //chiama se stessa incrementando ptrptr

}

else{ //arrivata all'ultimo elemento inserisce in

pre_insert(ptrptr,value); testa a lista vuota

}

}

3) Ricerca ricorsiva:

boolean search_r(struct list*ptr,float value,struct list**target){

boolean found=FALSE;

if (ptr != NULL){ //guardia

if (is_equal(ptr->value,value)){ //se valore elemento corrente=valore cercato

*target=ptr; //target punta a elemento trovato

found=TRUE; //found impostata su TRUE

}

else{

return search_r(ptr->next_ptr,value,target); //altrimenti ritorna found di se

} stessa applicata all'elemento successivo

}

else return found; //se arriva a fine lista senza trovare elemento cercato da FALSE

}

ALGORITMI DI RICERCA

1) Ricerca sequenziale:

I dati sono memorizzati in un array V in memoria. L'algoritmo confronta il valore cercato

con tutti gli elementi di V fino a trovare tale elemento.

boolean seq_search(float*V,int N,float target){

boolean found=FALSE;

int count=0;

while(count<N && found==FALSE){ //itera fino a trovare target o a fine array

if( is_equal(V[count],target)){ //confronta elementi con target (con la

found=TRUE; precisione di macchina)

}

else count++; //se non trova target scorre l'indice

}

return found;

}

# include <float . h> (FLT_EPSILON è la precisone di macchina)

boolean is_equal(float a , float b){

float dif;

dif=a-b;

if(dif <= a*FLT_EPSILON && dif>= -a*FLT_EPSILON){

return TRUE;

}

else return FALSE;

}

2) Ricerca binaria:

I dati sono memorizzati in un array V ordinato in maniera crescente. L'algoritmo confronta

target con l'elemento in posizione mediana di V (V[N/2]): se questo è maggiore o uguale a

target, la ricerca prosegue allo stesso modo nel semivettore sinsitro, altrimenti nel destro.

Ricorsiva:

boolean binary_search(float*V,int N,float target){

boolean found=FALSE;

if (N>0){ //guardia per array vuoto

if (isequal(V[N/2],target)){ //confronta elemento mediano con target

found=TRUE;

}

else{

if (V[N/2]>target){ //se elemento mediano è maggiore di target

return binary_search(V,N/2,target); //prosegue con ricorsione a sinistra

}

else return binary_search(&V[N/2+1],(N/2)-1,target); //altrimenti prosegue

} con ricorsione a destra

return found;

}

}

Iterativa:

boolean binary_search_iter(float*V,int N,float target){

int first=0; //indice di inizio vettore o sottovettore

int length=N; //lunghezza vettore o sottovettore

boolean found=FALSE;

while (length>0 && found==FALSE){ //guardia per vettore non nullo

if ( is_equal(V[first+length/2],target) found=TRUE;//confronto con elemento

else{ mediano

if (V[first+length/2]>target){ //se elemento mediano>target

length=length/2; //itera a sinistra dimezzando lenght

}

else{

first=first+length/2+1; //altrimenti itera a destra incrementando

length=length-length/2-1; first e cambiando lenght

}

}

}

return found;

}

3) Ricerca a salti:

I dati sono memorizzati in un array V ordinato in maniera crescente. L'algoritmo confronta

target con gli elementi in posizione k*step fino a trovare un elemento maggiore di target o

la fine di V, dopodiché esamina gli elementi presenti nell'ultimo step.

boolean step_search(float*V,int N,float target,int step){

int up=0; //indice che scorre in avanti

int down; //indice che scorre indietro

boolean greater_or_equal_found=FALSE;

boolean equal_found=FALSE;

while (up<N && greater_or_equal_found == FALSE){

if (V[up]>=target) greater_or_equal_found=TRUE; //ferma up se trova

else{ elemento>=target

up+=step; //altrimenti incrementa up di uno step

if (up>N-1 && up<N-1+step) up=N-1; //se up supera lunghezza array e

} l'up precedente non è arrivato a fine array assegna a up ultima posizione

}

if (greater_or_equal_found==TRUE){ //se ha trovato elemento>=target

down=up; //assegna a down posizione di up

while( V[down]>=target && equal_found==FALSE && down>=0){

//itera finché gli elementi sono>=target o non trova target o non

arriva a inizio array

if (is_equal(V[down],target) equal_found=TRUE; //se trova target, ok..

else down--; //..altrimenti decrementa down

}

}

return equal_found;

}

4) Ricerca binaria su lista sequenziale:

La lista sequenziale è ordinata in maniera crescente.

boolean binary_search_seq_list(struct list*ptr,float target){

int first=ptr->head; //assegna all'indice first il valore di head

int length=(ptr->tail – ptr->head)%(ptr->size); //lunghezza sottovettore

boolean found=FALSE;

while (length>0 && found==FALSE){//guardia array non nullo e target non trovato

if (is_equal(ptr->buffer[(first+length/2)%ptr->size],target)){ //confronto con

fou

Dettagli
Publisher
A.A. 2012-2013
10 pagine
SSD Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher LoreGino di informazioni apprese con la frequenza delle lezioni di Fondamenti di programmazione e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Firenze o del prof Berretti Stefano.