#ifndef _LISTADOB_H_ #define _LISTADOB_H_ #include <stdio.h> #include <stdlib.h> #include <ctype.h> typedef struct _Nodo { char x; int n; struct _Nodo* siguiente; struct _Nodo* anterior; //struct _Nodo*izq; //struct _Nodo*der; //con una concatenacion o arreglo } Nodo; //crear funcion para inswertar nuevo nodo anrtes del mator o el final y la otra crear el arbol por pares Nodo* crear(char X, int N) { Nodo* nuevo = (Nodo*)malloc(sizeof(Nodo)); nuevo->x = X; nuevo->n = N; nuevo->siguiente = NULL; nuevo->anterior = NULL; return nuevo; } Nodo* insertarFinal(Nodo* frente, char X, int N) { Nodo* nuevo = crear(X, N); if (frente == NULL) { return nuevo; } else { Nodo* aux = frente; while (aux->siguiente != NULL) { aux = aux->siguiente; } aux->siguiente = nuevo; nuevo->anterior = aux; } return frente; } Nodo* insertarInicio(Nodo* ultimo, char X, int N) { Nodo* masnuevo = crear(X, N); if (ultimo != NULL) { masnuevo->siguiente = ultimo; ultimo->anterior = masnuevo; } return masnuevo; } Nodo* borrarInicio(Nodo* ultimo) { if (ultimo == NULL) return NULL; Nodo* borrar = ultimo; ultimo = ultimo->siguiente; if (ultimo != NULL) { ultimo->anterior = NULL; } free(borrar); return ultimo; } Nodo* eliminarFinal(Nodo* frente) { if (frente == NULL) return NULL; if (frente->siguiente == NULL) { free(frente); return NULL; } Nodo* aux = frente; while (aux->siguiente->siguiente != NULL) { aux = aux->siguiente; } free(aux->siguiente); aux->siguiente = NULL; return frente; } Nodo* insertarPosicion(Nodo* frente, char x, int N) { Nodo* nuevo = crear(x, N); if (frente == NULL) return nuevo; Nodo* temp = frente; Nodo* anterior = NULL; while (temp != NULL && temp->n <= N) { anterior = temp; temp = temp->siguiente; } nuevo->siguiente = temp; nuevo->anterior = anterior; if (anterior != NULL) anterior->siguiente = nuevo; else frente = nuevo; if (temp != NULL) temp->anterior = nuevo; return frente; } Nodo* eliminarPosicion(Nodo* frente, int pos) { if (frente == NULL || pos < 0) return frente; Nodo* temp = frente; if (pos == 0) { frente = frente->siguiente; if (frente != NULL) { frente->anterior = NULL; } free(temp); return frente; } for (int i = 0; i < pos - 1 && temp != NULL; i++) { temp = temp->siguiente; } if (temp == NULL || temp->siguiente == NULL) return frente; Nodo* borrar = temp->siguiente; temp->siguiente = borrar->siguiente; if (borrar->siguiente != NULL) { borrar->siguiente->anterior = temp; } free(borrar); return frente; } void mostrar(Nodo* nodo) { if (nodo == NULL) { printf("Lista vacía\n"); return; } while (nodo != NULL) { if (nodo->x == ' ') printf(" (%d)\n", nodo->n); else if (nodo->x == '\n') printf("[\\n] (%d)\n", nodo->n); else if (nodo->x == '\t') printf("[\\t] (%d)\n", nodo->n); else printf("%c (%d)\n", nodo->x, nodo->n); nodo = nodo->siguiente; } } int longitud(Nodo* ultimo) { int s = 0; while (ultimo != NULL) { s++; ultimo = ultimo->siguiente; } return s; } void editar(Nodo* frente, char buscado, char nuevo) { while (frente != NULL) { if (frente->x == buscado) { frente->x = nuevo; } frente = frente->siguiente; } } void mostrarInvertida(Nodo* ultimo) { if (ultimo == NULL) return; while (ultimo->siguiente != NULL) { ultimo = ultimo->siguiente; } while (ultimo != NULL) { if (ultimo->x == ' ') printf(" (%d)\n", ultimo->n); else printf("%c (%d)\n", ultimo->x, ultimo->n); ultimo = ultimo->anterior; } } Nodo* buscarNodo(Nodo* frente, char c) { while (frente != NULL) { if (frente->x == c) { return frente; } frente = frente->siguiente; } return NULL; } Nodo* insertar(Nodo* lista, char c) { Nodo* temp = lista; while (temp != NULL) { if (temp->x == c) { temp->n += 1; Nodo* mover = temp; while (mover->siguiente != NULL && mover->n > mover->siguiente->n) { Nodo* siguiente = mover->siguiente; if (mover->anterior != NULL) mover->anterior->siguiente = siguiente; siguiente->anterior = mover->anterior; mover->siguiente = siguiente->siguiente; if (siguiente->siguiente != NULL) siguiente->siguiente->anterior = mover; siguiente->siguiente = mover; mover->anterior = siguiente; if (lista == mover) lista = siguiente; } return lista; } temp = temp->siguiente; } return insertarPosicion(lista, c, 1); } Nodo* insertarConFrecuencia(Nodo* lista, char c, int freq) { Nodo* temp = lista; int pos = 0; while (temp != NULL) { if (temp->x == c) { int nueva_freq = temp->n + freq; lista = eliminarPosicion(lista, pos); lista = insertarPosicion(lista, c, nueva_freq); return lista; } temp = temp->siguiente; pos++; } return insertarPosicion(lista, c, freq); } Nodo* eliminarCaracter(Nodo* cabeza, char caracter) { Nodo* actual = cabeza; while (actual != NULL) { if (actual->x == caracter) { if (actual->anterior != NULL) { actual->anterior->siguiente = actual->siguiente; } else { cabeza = actual->siguiente; } if (actual->siguiente != NULL) { actual->siguiente->anterior = actual->anterior; } free(actual); return cabeza; } actual = actual->siguiente; } printf("\nCaracter no encontrado.\n"); return cabeza; } #endif #include "Listadob.h" #include <locale.h> int main() { setlocale(LC_ALL, ""); FILE* archivo = fopen("texto.txt", "r"); if (archivo == NULL) { printf("No se pudo abrir el archivo.\n"); return 1; } Nodo* listadoble = NULL; char c; while ((c = fgetc(archivo)) != EOF) { if (isalpha(c) || isspace(c) || ispunct(c)) { c = tolower(c); listadoble = insertar(listadoble, c); } } fclose(archivo); int opcion; do { printf("\n--- MENU ---\n"); printf("1. Mostrar lista en orden\n"); printf("2. Mostrar lista en orden inverso\n"); printf("3. Eliminar \n"); printf("4. Editar caracter \n"); printf("5. Insertar caracter \n"); printf("6. Buscar nodo y mostrar frecuencia\n"); printf("7. Salir\n"); printf("Seleccione una opcion: "); scanf("%d", &opcion); getchar(); switch (opcion) { case 1: printf("\nLista doble en orden:\n"); mostrar(listadoble); break; case 2: printf("\nLista doble en orden inverso:\n"); mostrarInvertida(listadoble); break; case 3: { char caracter; printf("Ingrese el caracter del nodo a eliminar: "); scanf("%c", &caracter); getchar(); Nodo* nuevaLista = eliminarCaracter(listadoble, caracter); if (nuevaLista != listadoble) { printf("\nNodo eliminado.\n"); } listadoble = nuevaLista; mostrar(listadoble); break; } case 4: { char viejo, nuevo; printf("Ingrese el caracter a buscar: "); scanf("%c", &viejo); printf("Ingrese el nuevo caracter: "); scanf(" %c", &nuevo); editar(listadoble, viejo, nuevo); printf("\nListo!.\n"); mostrar(listadoble); break; } case 5: { char c; int freq; printf("Ingrese el caracter a insertar: "); scanf(" %c", &c); printf("Ingrese la frecuencia: "); scanf("%d", &freq); listadoble = insertarPosicion(listadoble, c, freq); //listadoble = insertarConFrecuencia(listadoble, c, freq); printf("\nCaracter insertado.\n"); mostrar(listadoble); break; } case 6: { char c; printf("Ingrese el caracter a buscar: "); scanf("%c", &c); Nodo* encontrado = buscarNodo(listadoble, c); if (encontrado != NULL) { printf("Nodo encontrado: %c (%d)\n", encontrado->x, encontrado->n); } else { printf("Caracter '%c' no encontrado en la lista.\n", c); } break; } case 7: printf("Saliendo...\n"); break; default: printf("Opcion invalida.\n"); } } while (opcion != 7); while (listadoble != NULL) { listadoble = borrarInicio(listadoble); } return 0; } el nodo n va antes del nodo t porque el texto dice:Insistir, Persistir y nunca Desistir. no lo quiero por frecuencia ASCII si no por frecuencia
Please keep input under 1000 characters