Untitled
unknown
plain_text
2 years ago
7.0 kB
9
Indexable
#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; }
Editor is loading...