#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 20
typedef struct Node { char data[MAX_SIZE];
struct Node* next;
} Node;
Node* head = NULL;
// Función para insertar un elemento en forma ordenada
void insertarOrdenado(char* elemento) { Node* nuevo = (Node*)malloc(sizeof(Node));
strcpy(nuevo->data, elemento);
nuevo->next = NULL;
if (head == NULL || strcmp(head->data, nuevo->data) > 0) { nuevo->next = head;
head = nuevo;
return;
}
Node* actual = head;
while (actual->next != NULL && strcmp(actual->next->data, nuevo->data) < 0) { actual = actual->next;
}
nuevo->next = actual->next;
actual->next = nuevo;
}
// Función para insertar un elemento al final de la lista
void insertarFinal(char* elemento) { Node* nuevo = (Node*)malloc(sizeof(Node));
strcpy(nuevo->data, elemento);
nuevo->next = NULL;
if (head == NULL) { head = nuevo;
return;
}
Node* actual = head;
while (actual->next != NULL) { actual = actual->next;
}
actual->next = nuevo;
}
// Función para buscar un elemento en la lista
Node* buscarElemento(char* elemento) { Node* actual = head;
Node* previo = NULL;
while (actual != NULL) { if (strcmp(actual->data, elemento) == 0) { if (previo != NULL) { previo->next = actual->next;
actual->next = head;
head = actual;
}
return actual;
}
previo = actual;
actual = actual->next;
}
return NULL;
}
// Función para almacenar la lista en un archivo
void almacenarLista(const char* nombreArchivo) { FILE* archivo = fopen(nombreArchivo, "w");
if (archivo == NULL) { printf("Error al abrir el archivo.\n"); return;
}
Node* actual = head;
while (actual != NULL) { fprintf(archivo, "%s\n", actual->data);
actual = actual->next;
}
fclose(archivo);
}
// Función para recuperar la lista desde un archivo
void recuperarLista(const char* nombreArchivo) { FILE* archivo = fopen(nombreArchivo, "r");
if (archivo == NULL) { printf("Error al abrir el archivo.\n"); return;
}
char buffer[MAX_SIZE];
while (fgets(buffer, sizeof(buffer), archivo)) { buffer[strcspn(buffer, "\n")] = 0; // Eliminar el salto de línea
insertarFinal(buffer);
}
fclose(archivo);
}
// Función para imprimir la lista
void imprimirLista() { Node* actual = head;
while (actual != NULL) { printf("%s -> ", actual->data); actual = actual->next;
}
printf("NULL\n");}
int main() { int opcion;
char elemento[MAX_SIZE];
char nombreArchivo[100];
do { printf("1. Insertar elemento ordenado\n"); printf("2. Insertar elemento al final\n"); printf("3. Buscar elemento\n"); printf("4. Almacenar lista en archivo\n"); printf("5. Recuperar lista desde archivo\n"); printf("6. Imprimir lista\n"); printf("0. Salir\n"); printf("Seleccione una opción: "); scanf("%d", &opcion); getchar(); // Limpiar el buffer
switch (opcion) { case 1:
printf("Ingrese el elemento a insertar: "); fgets(elemento, sizeof(elemento), stdin);
elemento[strcspn(elemento, "\n")] = 0; // Eliminar el salto de línea
insertarOrdenado(elemento);
break;
case 2:
printf("Ingrese el elemento a insertar al final: "); fgets(elemento, sizeof(elemento), stdin);
elemento[strcspn(elemento, "\n")] = 0; // Eliminar el salto de línea
insertarFinal(elemento);
break;
case 3:
printf("Ingrese el elemento a buscar: "); fgets(elemento, sizeof(elemento), stdin);
elemento[strcspn(elemento, "\n")] = 0; // Eliminar el salto de línea
if (buscarElemento(elemento)) { printf("Elemento encontrado y movido a la cabeza.\n"); } else { printf("Elemento no encontrado.\n"); }
break;
case 4:
printf("Ingrese el nombre del archivo: "); fgets(nombreArchivo, sizeof(nombreArchivo), stdin);
nombreArchivo[strcspn(nombreArchivo, "\n")] = 0; // Eliminar el salto de línea
almacenarLista(nombreArchivo);
break;
case 5:
printf("Ingrese el nombre del archivo: "); fgets(nombreArchivo, sizeof(nombreArchivo), stdin);
nombreArchivo[strcspn(nombreArchivo, "\n")] = 0; // Eliminar el salto de línea
recuperarLista(nombreArchivo);
break;
case 6:
imprimirLista();
break;
case 0:
printf("Saliendo...\n"); break;
default:
printf("Opción no válida.\n"); }
} while (opcion != 0);
return 0;
}