1

Definición de Clase DobNode

#ifndef TnDOBNODE
#define TnDOBNODE
#include <iostream>

template <class Tn>
class DobNode{
    public:
        Tn element;
        DobNode<Tn>* next;
        DobNode<Tn>* prev;

        DobNode(Tn pElement, DobNode<Tn>* pNext = NULL, DobNode<Tn>* pPrev = NULL){
            element = pElement;
            next = pNext;
            prev = pPrev;
        }
        DobNode(DobNode<Tn>* pNext = NULL, DobNode<Tn>* pPrev = NULL){
            next = pNext;
            prev = pPrev;
        }
};
#endif 

Definición de Clase Cola

#ifndef ECOLA
#define ECOLA
#include <iostream>
#include "DobNode.h"
using namespace std;
template <class E>
class Cola{
    public:
        DobNode<E> *front;
        DobNode<E> *rear;
        int tamano;
        Cola(){
            front = rear = NULL;
        }
        ~Cola() { clear(); }
        void clear(){
            while (front!=NULL){
                DobNode<E> *temp = front;
                front = front->prev;
                delete temp;
            delete front;
            }
        }
        void encolar(E elem){
            DobNode<E> *temp = new DobNode<E>(elem,rear);
            rear = temp;
        }
        E desencolar(){
            E elem = front->element;
            DobNode<E> *temp = front;
            front = front->prev;
            delete temp;
            tamano--;
            return elem;
        }
        E frente(){
            return front->element;
        }
        bool vacia(){
            return (rear==NULL);
        }       
};
#endif

Main

#include "Cola.h"
#include <iostream>

using namespace std;

int main(){
    Cola<int> ColaInt;
    cout << "Cola Mundo\n";
    ColaInt.encolar(4);
    ColaInt.encolar(6);
    ColaInt.encolar(7);
    ColaInt.encolar(9);
    ColaInt.encolar(1);
    ColaInt.desencolar();
    return 0;
}

El código es diseñado en c++ Y compilado con g++

Me genera Violación de segmento al desencolar el elemento

eferion
  • 49,291
  • 5
  • 30
  • 72
  • Cual es la traza del error que te sale? – jasilva Oct 21 '19 at 22:12
  • Implementas una clase `nodo` pensado para listas doblemente enlazadas pero luego implementas una lista enlazada... ¿Qué es lo que pretendes hacer exactamente? – eferion Oct 22 '19 at 06:58

1 Answers1

0

Te falla al desencolar porque Cola::front es NULL, por lo tanto front->element genera una violación de segmento.

En ningún momento de tu código asignas valor a Cola::front, por lo que se queda con el valor asignado en constructor que es NULL. Al encolar, si no hay aún nodos, tanto el frontal como el trasero son el nuevo nodo, en caso contrario el nuevo nodo insertado debe transformarse en el frontal (front):

if (!front && !rear) {
    front = rear = new DobNode<E>(elem, front);
} else {
    DobNode<E> *nuevo = new DobNode<E>(elem, front);
    front->next = nuevo;
    front = nuevo;                
}

  1. No incluyas cabeceras que no usas. Incluyes <iostream> en "DobNode.h", "Cola.h" y "main.cpp" cuando sólo estás usando sus utilidades en el último de esos archivos.
  2. No abuses de la cláusula using namespace std;, si usas dicha cláusula hazlo en el ámbito más pequeño posible NUNCA en un archivo de cabecera ("Cola.h"), lee este hilo para saber más.
  3. Utiliza la lista de inicialización de los constructores o la inicialización-en-declaración para simplificar el código.
  4. Ayúdate de alias de tipo para simplificar el código.
  5. El literal de puntero nulo en C++ es nullptr no la macro NULL.
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82