Título: Listas doblemente enlazadas Publicado por: AlexWolf097 en 23 Octubre 2017, 01:13 am estoy estudiando estructura de datos en c++, pero llegue al momento en donde no se esta imprimiendo de forma correcta mi lista, en la primera opcion, que es "Insertar()" se imprime solo el primer elemento de mi lista, y en la segunda opcion que es "Fina()" solo se imprime correctamente hasta el tercer elemento.
Agradeceria mucho su ayuda si me pudieran orientar para encontrar mi error. Código: #include <bits/stdc++.h> Título: Re: Listas doblemente enlazadas Publicado por: Serapis en 23 Octubre 2017, 17:33 pm Cuando señalas insertar (al inicio o al final), no debieras imprimir la lista, eso haría inecesario en el menú, la opción imprimir... (que yo añadiría esa opción al menú) bien que mientras diseñas si tengas activa esa línea para ir verificando que las operaciones se realizan correctamente...
entonces lo pondrías tras la llamada en el menú, antes del Break... El nombre de 'Final', no es para nada ilustrativo de su funcionalidad. Insertar, siempre es añadir delante de algún item, OK, pero al final puedes llamarlo simplemente Añadir... sin más expecificaciones, al añadir, siempre se añade al final. Por último, no veo que lleves la cuenta de la cantidad de ítems en la lista... es más eficiente preguntar que 'Si Items=0', que 'Si Lista es null', y añadir al comienzo puede indicarse con un 0 y añadir al final con -1, y Añadir en cualquier otra posición (insertar), con cualquier otro valor entre 1 e ítems -2 Un control de la cuenta de nodos en la lista, aunque no es imprescindible, si es más que aconsejable, simplifica la lógica y funcionalidad de la misma a cambio de algo de código extra. Y ahora yendo a tus dudas: - Tu función 'Final' no está bien implementada... Trato de explicarte con un sencillo ejemplo, sea una lista con varios elementos, consideremos estos 3: Marte -> Jueves -> domingo vemos que domingo.anterior = jueves y vemos que Jueves.siguiente = domingo Ahora insertemos un elemento en medio, por ejemplo viernes. Las operaciones a realizar serán 4, verás: Código: viernes.siguiente = domingo Si el nodo a añadir es un extremo, solo necesita 2 asignaciones (si la lista doblemente enlazada no es circular)... Modifico tu código a pseudocódigo para hacerlo más legible: Esta función está bien, salvo la redundancia de establecer nulos, donde ya los hay y no llevar cuenta de ítems que tiene la lista. Código: if (lista = Nulo) Así tu función externa podría ser: Código: Funcion Añadir(dato, posicion) Y tus funciones internas serían ahora: AñadirAlFinal, AñadirAlComienzo, Insertar Fíjate que ahora insertar exigirá localizar el ítem en la posición pedida. al caso actual es una buena estrategia, porque recordando su posición, puede partirse desde 0 hasta actual desde actual hasta 0, desde actual hasta último, desde último hasta actual, según quede más cerca de un nodo u otro de los 3 implicados: primero, actual ó último... Reviso tu función 'Final' (Añadir): Simplifico tu código hacia pseudocódigo, más sencillo de ver así... Código: funcion Final Esta función te falla... porque Una lista, basta que tenga el nodo 'inicial, pero si tienes una lista doblemente enlazada, debieras mantener referencia al primer y último elemento. Cuando apuntas a lista (tu nodo lista), estás apuntando al primero nodo en ella, entonces lista.siguiente apunta al siguiente nodo en la lista, es decir al segundo nodo, no al último. Será el último solo si la lista tiene 2 ítems... Entonces tu función Final, está insertando nodos incorrectamente... usa nombre días o de meses y haz las asignaciones en papel para ver como va quedando concada inserción, para entender el problema. La implementación debe mantener referencia al primer y último nodo, y deja de llamar lista al primer nodo, porque eso te 'nubla la vista'. Aquí una sencilla implementación con referencias al primero, último y actual nodos, además lleva la cuenta de ítems... Estos son los miembros en la clase, debajo los métodos... Código: nodo Primero //primer nodo de la lista. Función externa para añadir nodos... Con cada añadido, se hace actual al nodo añadido, y se conserva su posición. Código: Funcion Añadir(Posicion) Añade el primer nodo a la lista. Código: funcion CrearLista (nodo n) Añade un nodo al comienzo de la lista. Código: Funcion AñadirAlComienzo(nodo n) Añade un nodo al final de la lista. Código: Funcion AñadirAlFinal(nodo n) Insertar un nodo en posiciones distintas del último y el primero. Código: Funcion Insertar(nodo n, entero posicion) Busca desde el primero hasta hallar el nodo en la posición pedida. Código: nodo = funcion BuscarNodo(entero posicion) Búsqueda optimizada, basada en el actual... para una lista con pocos elementos no se nota, cuanto más crece la lista, más útil resulta... Código: nodo = funcion BuscarNodo(entero posicion) Dejo a tu cargo Imprimir(DesdePosicion, HastaPosicion), con valores Imprimir(0,-1) debería imprimir toda la lista. Título: Re: Listas doblemente enlazadas Publicado por: AlexWolf097 en 25 Octubre 2017, 23:45 pm Muchas gracias por los comentarios, seguire practicando para dominar este tema
|