Untitled
unknown
plain_text
2 years ago
7.0 kB
12
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...