#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;
}