Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
7.0 kB
6
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100

struct nodo {
    int n;
    struct nodo* next;
    struct nodo* prec;
};

typedef struct {
    struct nodo* header;
    struct nodo* tailer;
} t_dlist;

void inseriscitesta(t_dlist* lista, int valore) {
    struct nodo* nuovonodo = (struct nodo*)malloc(sizeof(struct nodo));
    nuovonodo->n = valore;
    nuovonodo->next = lista->header;
    nuovonodo->prec = NULL;

    if (lista->header != NULL) {
        lista->header->prec = nuovonodo;
    }

    lista->header = nuovonodo;

    if (lista->tailer == NULL) {
        lista->tailer = nuovonodo;
    }
}

void inseriscicoda(t_dlist* lista, int valore) {
    struct nodo* nuovonodo = (struct nodo*)malloc(sizeof(struct nodo));
    nuovonodo->n = valore;
    nuovonodo->next = NULL;

    if (lista->tailer == NULL) {
        nuovonodo->prec = NULL;
        lista->header = nuovonodo;
    } else {
        lista->tailer->next = nuovonodo;
        nuovonodo->prec = lista->tailer;
    }

    lista->tailer = nuovonodo;
}

void stampalifo(struct nodo* testa) {
    struct nodo* nodocorrente = testa;
    while (nodocorrente != NULL) {
        printf("%d ", nodocorrente->n);
        nodocorrente = nodocorrente->next;
    }
    printf("\n");
}

void stampafifo(struct nodo* tailer) {
    struct nodo* nodocorrente = tailer;
    while (nodocorrente != NULL) {
        printf("%d ", nodocorrente->n);
        nodocorrente = nodocorrente->prec;
    }
    printf("\n");
}

void eliminaelemento(struct nodo** testa, int valoredaeliminare) {
    struct nodo* nodocorrente = *testa;
    struct nodo* nodoprecedente = NULL;

    while (nodocorrente != NULL) {
        if (nodocorrente->n == valoredaeliminare) {
            struct nodo* nodoDaEliminare = nodocorrente;

            if (nodoprecedente == NULL) {
                *testa = nodocorrente->next;
            } else {
                nodoprecedente->next = nodocorrente->next;
            }

            if (nodocorrente->next != NULL) {
                nodocorrente->next->prec = nodoprecedente;
            }

            nodocorrente = nodocorrente->next;
            free(nodoDaEliminare);
        } else {
            nodoprecedente = nodocorrente;
            nodocorrente = nodocorrente->next;
        }
    }
}

int update(struct nodo** testa, int valoreupdate, int valoredacambiare) {
    struct nodo* nodocorrente = *testa;
    int count = 0;

    while (nodocorrente != NULL) {
        if (valoreupdate == nodocorrente->n) {
            nodocorrente->n = valoredacambiare;
            count++;
        }
        nodocorrente = nodocorrente->next;
    }

    return count; 
}

void search(struct nodo* testa, struct nodo* ptr[], int valoresearch) {
    struct nodo* nodocorrente = testa;
    int i = 0;

    while (nodocorrente != NULL && i < MAX_SIZE) {
        if (valoresearch == nodocorrente->n) {
            ptr[i] = nodocorrente;
            i++;
        }
        nodocorrente = nodocorrente->next;
    }
    ptr[i] = NULL;
}

void liberaLista(struct nodo* testa) {
    while (testa != NULL) {
        struct nodo* nodoCorrente = testa;
        testa = testa->next;
        free(nodoCorrente);
    }
}
void caricaDaFile(t_dlist* lista) {
    FILE* fp = fopen("datiLista.csv", "r");
    if (fp == NULL) {
        perror("Errore nell'apertura del file");
        return;
    }

    int valore;
    while (fscanf(fp, "%d", &valore) == 1) {
        inseriscicoda(lista, valore);
    }

    fclose(fp);
}

void salvasufile(t_dlist* lista) {
    
    FILE* fp = fopen("datiLista.csv", "w");
    if (fp == NULL) {
        fprintf(stderr, "errore nell'apertura file");
        return; 
    }
    struct nodo* nodocorrente = lista->header;
    while (nodocorrente != NULL) { 
        fprintf(fp, "%d ", nodocorrente->n);
        nodocorrente = nodocorrente->next;
    }
    fprintf(fp, "\n");
    fclose(fp);
}

int main() {
    t_dlist lista; 
    lista.header = NULL;
    lista.tailer = NULL;
    struct nodo* ptr[MAX_SIZE];
    int scelta, valore, valoreUpdate, nuovoValore;
    struct nodo* vett[MAX_SIZE] = {NULL};
    caricaDaFile(&lista);
    while (1) {
        printf("MENU\n");
        printf("1. Inserisci elemento in testa\n");
        printf("2. Stampa LIFO (Pila)\n");
        printf("3. Stampa FIFO (Coda)\n");
        printf("4. Elimina elemento\n");
        printf("5. Inserisci elemento in coda\n");
        printf("6. Aggiorna elemento\n");
        printf("7. Cerca valore\n");
        printf("8. Libera lista ed esci\n");
        printf("Scelta: ");
        scanf("%d", &scelta);

        switch (scelta) {
            case 1:
                printf("Inserisci un valore: ");
                scanf("%d", &valore);
                inseriscitesta(&lista, valore);
                salvasufile(&lista);
                break;
            case 2:
                printf("Pila (LIFO): ");
                stampalifo(lista.header);
                break;
            case 3:
                printf("Coda (FIFO): ");
                stampafifo(lista.tailer);
                break;
            case 4:
                printf("Inserisci il valore da eliminare: ");
                scanf("%d", &valore);
                eliminaelemento(&lista.header, valore);
                printf("L'elemento %d è stato eliminato correttamente dalla lista.\n", valore);
                salvasufile(&lista);
                break;
            case 5:
                printf("Inserisci un valore in coda: ");
                scanf("%d", &valore);
                inseriscicoda(&lista, valore);
                salvasufile(&lista);
                break;
            case 6:
                printf("Inserisci il valore da aggiornare: ");
                scanf("%d", &valoreUpdate);
                printf("Inserisci il nuovo valore: ");
                scanf("%d", &nuovoValore);
                int result = update(&lista.header, valoreUpdate, nuovoValore);
                if (result > 0) {
                    printf("Elemento %d aggiornato %d volte.\n", valoreUpdate, result);
                } else {
                    printf("Elemento non trovato nella lista.\n");
                }
                salvasufile(&lista);
                break;
            case 7:
                printf("Inserisci il valore da cercare: ");
                scanf("%d", &valore);
                search(lista.header, ptr, valore);
                printf("Risultati della ricerca: ");
                int i = 0;
                while (ptr[i] != NULL) {
                printf("%d ", ptr[i]->n);
                i++;
                }
                printf("\n");
                break;
            case 8:
               liberaLista(lista.header);
               salvasufile(&lista);
               printf("Lista liberata. Uscita dal programma.\n");
               return 0;
        default:
               printf("Scelta non valida.\n");
               break;
            }
    }

    return 0;
}