#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static FILE *fp;
// struttura del nodo
typedef struct dato{
int n;
char nome[10];
}element_type;
typedef struct elemento {
element_type value;
struct elemento *next;
} nodo;
typedef nodo *list;
// var globali
list L = NULL;
list root = NULL;
// prototipi
void stampalista(list);
void scrivi(list);
void delete_nodo(list);
int empty(list);
list cons_pila(element_type,list);
list cons_coda(element_type,list);
list cons_sort(element_type,list);
list inputFile();
// main principale
main() {
int scelta;
element_type x;
list lista_pila = NULL;
list lista_coda = NULL;
list lista_sort = NULL;
while(scelta != 0){
system("CLS");
printf("\nIntrodurre numero: \t");
scanf("%d", &x.n);
printf("\nIntrodurre nome: \t");
scanf("%s", x.nome);
lista_pila = cons_pila(x, lista_pila);
lista_coda = cons_coda(x, lista_coda);
lista_sort = cons_sort(x, lista_sort);
system("CLS");
printf("\t* PREMERE 1 PER CONTINUARE\n\n\t* PREMERE 0 PER USCIRE\n");
scanf("%d",&scelta);
system("CLS");
}
printf("lista costruita inserendo gli elementi in testa: \n");
stampalista(lista_pila);//stampa a video gli elementi della lista
printf("\nlista costruita inserendo gli elementi in coda: \n");
stampalista(lista_coda);
printf("\nlista costruita inserendo gli elementi in ordine crescente in base al numero: \n");
stampalista(lista_sort);
scrivi(lista_sort);//scrive in un file binario gli elementi della lista, salvo solo lista_sort
//perchè non avrebbe senso salvare tutte e tre le liste, contengono gli stessi
//elementi però distribuiti in maniera diversa, poi invocando la funzione
//inputFile() per costruire una nuova lista con i dati contenuti nel file.
list new_lista;
new_lista = inputFile();
//N.B. nella funzione inputFile() basta cambiare la chiamata cons_*** (dentro all'istruzione while)
//per creare una coda,una pila o una lista ordinata
printf("\nnuova lista creata con i dati contenuti sul file liste.dat : \n");
stampalista(new_lista);
system("PAUSE");
}
// salva gli elementi di una lista data in un file binario
void scrivi(list lista){
element_type tx;
if(!empty(lista)){
if((fp = fopen("liste.dat","wb")) == NULL){
printf("Errore durante l'apertura del file...");
}else{
while(lista != NULL){
tx.n = lista->value.n;
strcpy(tx.nome,lista->value.nome);
fwrite(&tx,sizeof(element_type),1,fp);
lista = lista->next;
}
rewind(fp);
close(fp);
}
}else printf("\n\tLa lista non contiene nessun elemento..\n");
}
// stampa lista data
void stampalista(list r){
if(!empty(r)){
printf("\t| Numero | | nome |\n------------------------------\n");
while(r != NULL){
printf("\t%d\t%s\n", r
->value.
n, r
->value.
nome);
r = r->next;
}
printf("------------------------------\n");
}else printf("\n\tLa lista non contiene nessun elemento..\n");
}
//controllo lista vuota
int empty(list h){
if(h == NULL)return 1;
else return 0;
}
//crea una lista ordinata in ordine crescente in base al numero
list cons_sort(element_type e, list l){
list newp;// puntatore al nuovo nodo
list prov;// puntatore al nodo precedente della lista
list cur;// puntatore al nodo corrente della lista
newp = (list)malloc(sizeof(nodo));//crea il nuovo nodo
newp->value.n = e.n;
strcpy(newp->value.nome,e.nome);//memorizza valore nel nodo
newp->next = NULL; // il nodo nn è collegato a nessun altro nodo
prov = NULL;
cur = l;
//esegue un ciclo per trovare la posizione corretta nella lista
while(cur != NULL && e.n > cur->value.n){
prov = cur; //passa al....
cur = cur->next;//...prossimo nodo
}
if(prov == NULL){//inserisce il nodo in testa alla lista
newp->next = l;
l = newp;
}else{//inserisce il nodo tra prov e curr
prov->next = newp;
newp->next = cur;
}
return l;
}
list inputFile(){
list newroot = NULL;
element_type T;
if((fp = fopen("liste.dat","rb")) == NULL){
printf("Errore durante l'apertura del file...");
return NULL;
}else{
rewind(fp);//posiziono fp in testa al file
fread(&T, sizeof(element_type), 1, fp);
while(!feof(fp)){
newroot = cons_sort(T,newroot);//////////N.B.
fread(&T, sizeof(element_type), 1, fp);
}
close(fp);
}
return newroot;
}
//costruisce una nuova lista aggiungento l'elemento in testa alla lista
list cons_pila(element_type EL, list l) {
list t;
t = (list)malloc(sizeof(nodo));
t->value.n = EL.n;
strcpy(t->value.nome,EL.nome);
t->next = l;
return t;
}
//costruisce una nuova lista aggiungento l'elemento in coda alla lista
list cons_coda(element_type EL, list l) {
list t,prov;
list curr = l;
t = (list)malloc(sizeof(nodo));//inserisce elemento nel nuovo nodo
t->value.n = EL.n;
strcpy(t->value.nome,EL.nome);
t->next = NULL;
if(empty(curr))return t;//se la lista è vuota inserisce il nodo in testa alla lista
else{
while(curr != NULL){
prov = curr;
curr = curr->next;
}
prov->next = t;//altrimenti inserisce l'elemento in coda
return l;
}
}