prof. Nunzio Brugaletta Programmazione e linguaggio C

EnneBi - Programmazione
Avanti Indietro Inizio


6.7 Gestione di una lista concatenata

La lista concatenata è la struttura ideale da utilizzare quando si debbano rappresentare insiemi di dati in cui le operazioni di inserimento e cancellazione siano prioritarie. Tali operazioni, come si vedrà, vengono permesse in maniera estremamente agevole dalla struttura.

/* Gestione di una LISTA con un elenco di libri */

#include <stdlib.h>

/* Implementazione della Lista */

typedef struct rec *lpointer;
typedef struct rec {
char titolo[50];
char autore[20];
char editore[20];
float prezzo;
lpointer next;
}libro;
lpointer entryp=NULL; /*1*/
...
/* Funzioni per la gestione della Lista */

void esamina(lpointer p1); /*1*/
...
esamina(entryp); /*2*/
...

/* Funzioni per la gestione di una lista */

void esamina(lpointer p1){
if(p1){ /*3*/

/* elaborazione nodo */ /*4*/

puts(p1->titolo);
puts(p1->autore);
puts(p1->editore);
printf("%4.2f\n",p1->prezzo);
while(!getchar()=='\n'); /*5*/

/* fine elaborazione nodo */

esamina(p1->next); /*6*/
}
}
/* Funzioni per la gestione della Lista */

void inserisci(lpointer* pins,lpointer pnodo); /*1*/

/* Altre funzioni del programma */

void nuovolib(); /*1*/
void aggiungi(lpointer pn); /*1*/
lpointer* cerca(lpointer* inizio,char tit); /*1*/ ... /* Inserimento di un libro nella lista i libri sono inseriti alfabeticamente per titolo */ void nuovolib(){ lpointer nuovo; nuovo=(lpointer) malloc(sizeof(libro)); /*2*/ if(nuovo==NULL){ printf("\nMemoria esaurita: inserimento impossibile"); }else{ printf("\nInserimento di un libro"); printf("\nTitolo : "); gets(nuovo->titolo); printf("Autore : "); gets(nuovo->autore); printf("Editore : "); gets(nuovo->editore); printf("Prezzo : "); scanf("%f",&nuovo->prezzo); aggiungi(nuovo); /*3*/ } } /* Aggiunge il nuovo elemento nella posizione che gli compete */ void aggiungi(lpointer pn){ lpointer *posins; /*4*/ posins=cerca(&entryp,pn->titolo); /*5*/ inserisci(posins,pn); /*6*/ } /* Cerca la posizione dell'inserimento */ lpointer* cerca(lpointer* inizio,char *tit){ if(*inizio==NULL) /*7*/ return inizio; if((strcmp((*inizio)->titolo,tit)>0)) /*8*/ return inizio; inizio=cerca(&((*inizio)->next),tit); /*9*/ return inizio; /*10*/ }; /* Funzioni per la gestione di una lista */ void inserisci(lpointer* pins,lpointer pnodo){ /*11*/ pnodo->next=*pins; /*12*/ *pins=pnodo; /*13*/ }
...
/* Elimina un elemento dalla lista */

void elimina();

/* Altre funzioni del programma */

lpointer* cerca(lpointer *inizio,char *tit);
void canclib();
...
/* Cancella un titolo dalla lista */

void canclib(){
char titcanc[50];
lpointer* poscanc;

printf("\nTitolo da cancellare :");
gets(titcanc); /*1*/

poscanc=cerca(&entryp,titcanc,'='); /*2*/

if(*poscanc==NULL) /*3*/
printf("\nTitolo inesistente: cancellazione impossibile");
else
elimina(poscanc); /*4*/
}

lpointer* cerca(lpointer *inizio,char *tit){
...
if(!strcmp((*inizio)->titolo,tit)) /*5*/
return inizio;
}
...
}

/* Funzioni per la gestione di una lista */

void elimina(lpointer* pcanc){
lpointer temp;

temp=*pcanc; /*6*/
*pcanc=(*pcanc)->next; /*7*/
free(temp); /*8*/
}


Avanti Indietro Inizio

http://ennebi.solira.org ennebi@solira.org