如何在制作循环列表时调试我的错误?

时间:2016-03-25 21:59:38

标签: c++ visual-studio visual-c++

这是带问题的代码:

class nodoDoble {
    public:
        nodoDoble(int cod, int ced, string nom, int tel, int per)
        {
        codigo = cod;
        cedula = ced;
        nombre = nom;
        telefono = tel;
        permiso = per;
        siguiente = NULL;
        anterior = NULL;
        }

nodoDoble(int cod, int ced, string nom, int tel, int per, nodoDoble *signodo)
{
    codigo = cod;
    cedula = ced;
    nombre = nom;
    telefono = tel;
    permiso = per;
    siguiente = signodo;
}

private:
int codigo;
int cedula;
string nombre;
int telefono;
int permiso;
nodoDoble *siguiente;
nodoDoble *anterior;


friend class listaD;
};

typedef nodoDoble *pnodoD;

这是列表类:

class listaD {
    public:
        listaD() { primero = actual = NULL; }
        ~listaD();

        void InsertarInicio(int cod, int ced, string nom, int tel, int per);
        void InsertarFinal(int cod, int ced, string nom, int tel, int per);
        void InsertarPos(int cod, int ced, string nom, int tel, int per, int pos);
        bool ListaVacia() { return primero == NULL; }

        void Mostrar();
        void Siguiente();
        void Primero();
        void Ultimo();
        void BorrarFinal();
        void BorrarInicio();
        void borrarPosicion(int pos);
        int largoLista();

    private:
        pnodoD primero;
        pnodoD actual;
 };

listaD::~listaD()
{
    pnodoD aux;

    while (primero) {
        aux = primero;
        primero = primero->siguiente;
        delete aux;
    }
    actual = NULL;
}

int listaD::largoLista() {
    int cont = 0;

    pnodoD aux;
    aux = primero;
    if (ListaVacia()) {
        return cont;
}
else {
    while (aux->siguiente != primero) {
        aux = aux->siguiente;
        cont++;
    }
    return cont;
    }

}

void listaD::InsertarInicio(int cod, int ced, string nom, int tel, int per)
{
    if (ListaVacia()) {
        primero = new nodoDoble(cod, ced, nom, tel, per);
        primero->siguiente = primero;
    }
    else
    {
        pnodoD aux = primero;
        while (aux->siguiente != primero) {
        aux = aux->siguiente;
    }
        primero = new nodoDoble(cod, ced, nom, tel, per, primero);
        primero->siguiente->anterior = primero;
        aux->siguiente = primero;
        primero->anterior = aux;
    }
}

void listaD::InsertarFinal(int cod, int ced, string nom, int tel, int per)
{
    if (ListaVacia()) {
        primero = new nodoDoble(cod, ced, nom, tel, per);
        primero->siguiente = primero;
        primero->anterior = primero;
    }

    else
    {
        pnodoD aux = primero;
        while (aux->siguiente != primero)
            aux = aux->siguiente;
        aux->siguiente = new nodoDoble(cod, ced, nom, tel, per);
        aux->siguiente->anterior = aux;
        aux->siguiente->siguiente = primero;
        primero->anterior = aux->siguiente;
    }
}


void listaD::InsertarPos(int cod, int ced, string nom, int tel, int per, int pos)
{
    if (ListaVacia()) {
        primero = new nodoDoble(cod, ced, nom, tel, per);
        primero->siguiente = primero;
        primero->anterior = primero;
    }

    else {
        if (pos <= 1)
            InsertarInicio(cod, ced, nom, tel, per);
        else
        {
            pnodoD aux = primero;
            int i = 2;
            while ((i != pos) && (aux->siguiente != primero)) {
                i++;
                aux = aux->siguiente;
            }
            pnodoD nuevo = new nodoDoble(cod, ced, nom, tel, per);
            nuevo->siguiente = aux->siguiente;
            aux->siguiente = nuevo;
            aux->siguiente->anterior = aux;
            nuevo->siguiente->anterior = nuevo;
        }
    }
}

void listaD::BorrarFinal()
{
    if (ListaVacia()) {
        cout << "No hay elementos en la lista:" << endl;

    }
    else {
        if (primero->siguiente == primero) {
            pnodoD temp = primero;
            primero = NULL;
            delete(temp);
        }
        else {

            pnodoD aux = primero;
            while (aux->siguiente->siguiente != primero)

                aux = aux->siguiente;


            pnodoD temp = aux->siguiente;
            aux->siguiente = primero;
            primero->anterior = aux;

            delete temp;
        }
    }
}

void listaD::BorrarInicio()
{
    if (ListaVacia()) 
        cout << "No hay elementos en la lista:" << endl;


    else {
        if (primero->siguiente == primero) {
            pnodoD temp = primero;
            primero = NULL;
            delete (temp);
        }
        else {

            pnodoD aux = primero;
            while (aux->siguiente != primero)
                aux = aux->siguiente;
            pnodoD temp = primero;
            primero = primero->siguiente;
            aux->siguiente = primero;
            primero->anterior = aux;
            delete (temp);
        }
    }
}



void listaD::borrarPosicion(int pos) {
    if (ListaVacia()) {
        cout << "Lista vacia" << endl;
    }
    else {
        if ((pos>largoLista()) || (pos<0)) {
            cout << "Error en posicion" << endl;
        }
        else {
            if (pos == 1)
                BorrarInicio();
            else
            {
                int cont = 2;
                pnodoD aux = primero;
                while (cont<pos) {
                    aux = aux->siguiente;
                    cont++;
                }
                pnodoD temp = aux->siguiente;
                aux->siguiente = aux->siguiente->siguiente;
                aux->siguiente->anterior = aux;
                delete temp;
            }
        }
    }

}


void listaD::Mostrar()
{
    nodoDoble *aux;

    aux = primero;
    while (aux->siguiente != primero) {
        cout << aux->cedula << ": " << aux->nombre << aux->nombre << "-> ";
        aux = aux->siguiente;
    }
    cout << aux->cedula << ": " << aux->nombre << "->";
    cout << endl;
}

问题出现了:

int main() {

    listaD Lista;



    Lista.InsertarInicio(01, 116, "pablo", 89, 2);
    Lista.Mostrar();
    cin.get();
    return 0;}

这是我在完成main中的最后一个命令时得到的错误:

error picture

1 个答案:

答案 0 :(得分:0)

第一个问题:

这个构造函数:

nodoDoble(int cod, int ced, string nom, int tel, int per, nodoDoble *signodo)
{
    codigo = cod;
    cedula = ced;
    nombre = nom;
    telefono = tel;
    permiso = per;
    siguiente = signodo;
}

不会初始化成员anterior

可能还有其他问题......