Generation

fix invalid codeSat, 07 Jun 2025

#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

Want to kickstart your project?Use the new AI Studio to create your code