codice:
#include <stdio.h>#include <stdlib.h>
#include "listaPtrc.h"
// SOTTOPROGRAMMI DI SERVIZIO:
//---------------------------
void aggiungiInTesta(lista* plista, tipoValori elem);
lista puntatoreAllUltimo(lista l);
lista puntatoreAllaPos (lista l, int pos);
boolean posizioneEsistente (lista l, int pos);
void errore(char* messaggio);
//---------------------------
void inizializza (lista* plista) {
*plista = NULL;
return;
}
void leggi (lista* plista) {
int i, numero;
tipoValori valore;
printf("\nLettura dei valori della lista\n");
printf("------------------------------\n");
printf("Quanti valori contiene la lista ? ");
scanf("%d", &numero);
while (numero < 0) {
printf("ERRORE: VALORE NON AMMESSO\n");
printf("Il valore deve essere maggiore o uguale di 0 ");
printf("Immetti valore corretto: ");
scanf("%d", &numero);
}
inizializza(plista);
for (i = 0; i < numero; i++) {
printf("--Immetti il valore n.%d:", i);
leggiValore(&valore);
aggiungiInCoda(plista, valore);
}
return;
}
void leggiValore(tipoValori* valore) {
printf("Codice del prodotto: ");
scanf("%s", valore->codice);
printf("Marca del prodotto: ");
scanf("%s", valore->marca);
printf("Descrizione del prodotto: ");
scanf("%s", valore->descrizione);
printf("Numero di prodotti presenti in magazzino: ");
scanf("%d", valore->quantita);
}
void stampa (lista l) {
int i = 0;
lista p = l;
printf("\nStampa dei valori della lista\n");
printf("-----------------------------\n");
if (listaVuota(l)) {
printf("Lista vuota\n");
} else {
while (p != NULL) {
printf("--Valore n.%d: ", i);
stampaValore(p->valore);
p = p->next;
i++;
}
}
return;
}
void stampaValore(tipoValori valore) {
printf("/n Codice del prodotto: %s", valore.codice);
printf("Marca del prodotto: %s", valore.marca);
printf("Descrizione del prodotto: %s", valore.descrizione);
printf("Quantità del prodotto in magazzino: %d", valore.quantita);
}
/*
void salva (lista l, char* nomeFile) {
int i;
lista p = l;
FILE* outFile;
//printf("Salvataggio nel file: -%s-", nomeFile);
outFile = fopen(nomeFile, "w");
while (p != NULL) {
salvaValore(outFile, p->valore);
p = p->next;
}
fclose(outFile);
return;
}
void salvaValore(FILE* outFile, tipoValori valore) {
fprintf(outFile, "Codice del prodotto: %s \n", valore.codice);
fprintf(outFile, "Marca del prodotto: %s \n", valore.marca);
fprintf(outFile, "Descrizione del prodotto: %s \n", valore.descrizione);
fprintf(outFile, "Quantità del prodotto in magazzino: %d \n", valore.quantita);
}
void carica (lista* plista, char* nomeFile){
int i;
tipoValori valore;
FILE* inFile;
//printf("Caricamento dal file: -%s-", nomeFile);
inFile = fopen(nomeFile, "r");
inizializza(plista);
while (TRUE) {
if (caricaValore(inFile, plista) == FALSE) {
break;
}
}
fclose(inFile);
return;
}
boolean caricaValore(FILE* inFile, lista* plista) {
tipoValori valore;
if (fscanf(inFile, "%f", &valore) == EOF) {
return FALSE;
}
aggiungiInCoda(plista, valore);
return TRUE;
}
*/
void aggiungiInCoda (lista* plista, tipoValori elem){
lista p;
if (listaVuota(*plista)) {
aggiungiInTesta(plista, elem);
} else {
p = puntatoreAllUltimo(*plista);
p->next = (lista)malloc(sizeof(elemento));
if (p->next == NULL) {
errore("Impossibile aggiungere elemento");
} else {
p->next->valore = elem;
p->next->next = NULL;
}
}
return;
}
void aggiungiInPosizione (lista* plista, tipoValori elem, int pos) {
lista p;
lista tmp;
if (!posizioneEsistente(*plista, pos)) {
if (pos != numeroElementi(*plista)) {
errore("Posizione inesistente. Impossibile inserire");
} else {
aggiungiInCoda(plista, elem);
}
} else {
if (pos == 0) {
aggiungiInTesta(plista, elem);
} else {
p = puntatoreAllaPos (*plista, pos - 1);
tmp = p->next;
p->next = (lista)malloc(sizeof(elemento));;
if (p->next == NULL) {
errore("Impossibile aggiungere elemento");
p->next = tmp;
} else {
p->next->valore = elem;
p->next->next = tmp;
}
}
}
return;
}
void eliminaInCoda (lista* plista){
elemento* tmp;
if (listaVuota(*plista)) {
errore("Lista vuota. Impossibile eliminare");
} else {
if ((*plista)->next == NULL) {
tmp = *plista;
*plista = NULL;
} else {
lista p = puntatoreAllaPos(*plista, numeroElementi(*plista) - 2);
tmp = p->next;
p->next = NULL;
}
free(tmp);
}
return;
}
void eliminaInPosizione (lista* plista, int pos){
lista tmp;
if (!posizioneEsistente(*plista, pos)) {
errore("Posizione inesistente. Impossibile eliminare");
} else {
if (pos == 0) {
tmp = *plista;
*plista = (*plista)->next;
} else {
lista p = puntatoreAllaPos (*plista, pos - 1);
tmp = p->next;
p->next = p->next->next;
}
free(tmp);
}
return;
}
/*
int cercaPosizione (lista l, tipoValori elem) {
lista tmp = l;
int i = 0;
while (tmp != NULL) {
if (confronta(tmp->valore,elem)) {
return i;
} else {
tmp = tmp->next;
i++;
}
}
return -1;
}
boolean confronta(tipoValori val1, tipoValori val2) {
return val1 == val2;
}
*/
int numeroElementi (lista l){
lista tmp = l;
int conta = 0;
while (tmp != NULL) {
tmp = tmp->next;
conta++;
}
return conta;
}
tipoValori elementoInPosizione (lista l, int pos) {
tipoValori valore;
lista tmp = puntatoreAllaPos (l, pos);
return tmp->valore;
}
boolean listaVuota (lista l) {
return (l == NULL);
}
boolean listaPiena (lista l) {
return FALSE;
}
// sottoprogrammi privati
boolean posizioneEsistente (lista l, int pos){
if (listaVuota(l)) {
return FALSE;
} else {
return (pos >= 0 && pos < numeroElementi(l));
}
}
elemento* puntatoreAllUltimo (lista l) {
lista p = l;
if (p != NULL) {
while (p->next != NULL) {
p = p->next;
}
}
return p;
}
elemento* puntatoreAllaPos (lista l, int pos) {
int i;
lista p = l;
if (p != NULL) {
for (i = 0; i < pos; i++) {
p = p->next;
}
}
return p;
}
void aggiungiInTesta (lista* plista, tipoValori elem){
lista tmp = *plista;
*plista = (lista)malloc(sizeof(elemento));;
if (*plista == NULL) {
errore("Impossibile aggiungere elemento");
} else {
(*plista)->valore = elem;
(*plista)->next = tmp;
}
return;
}
void errore(char* messaggio) {
printf("***** ERRORE: %s\n", messaggio);
exit(EXIT_FAILURE);
}