DEV Community

Leo
Leo

Posted on

Listas simplemente enlasadas

Insercción, eliminación y lectura de listas simplemente enlazadas

Image description

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;
typedef int TipoDato;
struct nodo{
            TipoDato Info;
            struct nodo *Liga;
};

typedef struct nodo *TipoLista;

void InicializarLista(TipoLista &P){
    P=NULL;
}

bool ListaVacia(TipoLista P){
    return (P==NULL);
}

void CrearInicio( TipoLista &P ){
    TipoLista Q;
    int Res;

    if ( ListaVacia(P) ) {
        P= new nodo;
        cout << "Escriba un valor del nodo: ";
        cin >> P-> Info;
        P->Liga=NULL;
    } else {
        Q=new nodo;
        cout << "Escriba valor del nodo: ";
        cin >> Q ->Info;
        Q->Liga=P;
        P=Q;
    }
    cout << "Desea anexar mas nodos a la lista? 1=Si 2=No " << endl;
    cin >>Res;

    while(Res==1){
        Q=new nodo;
        cout << "Escriba valor del nodo: ";
        cin >> Q ->Info;
        Q->Liga=P;
        P=Q;

        cout << "Desea anexar mas nodos a la lista? 1=Si 2=No " << endl;
        cin >>Res;
    }
}

void Recorre_iterativo(TipoLista P){

TipoLista Q=P;

while(Q!=NULL){
    cout<< Q->Info << " ";
    Q=Q->Liga;
}
}

void Recorre_recursivo(TipoLista P){
if(P!=NULL){
    cout<< P->Info << " ";
    Recorre_recursivo(P->Liga);
}
}

void InsertarInicio ( TipoLista &P, TipoDato Dato ){

    TipoLista Q;
    Q = new nodo;
    Q -> Info = Dato;
    Q -> Liga = P;
    P = Q;
}

void InsertarFinal ( TipoLista &P, TipoDato Dato ){

    TipoLista Q, T;

    Q = new nodo;
    Q -> Info = Dato;
    Q -> Liga = NULL;

    if ( !ListaVacia( P ) ) {

        T = P;
        while ( T -> Liga != NULL )
        T = T -> Liga;
        T -> Liga = Q;
    } else P = Q;
}

void InsertarAntes ( TipoLista &P, TipoDato Dato, TipoDato Ref ) {

    if( !ListaVacia(P) ){

        TipoLista Q = P, T;

        while( Q != NULL && Q -> Info != Ref ){
            T = Q;
            Q = Q -> Liga;
        }

        if( Q != NULL){
            TipoLista X = new nodo;
            X-> Info = Dato;
            if( Q == P ){
                X->Liga = P;
                P = X;
            } else{
                T->Liga = X;
                X->Liga = Q;
            }
        } else cout << "\n\tLa referencia "<< Ref << " no existe!\n" << endl;
    } else cout << "\n\tLista vacia, ingrese datos\n";
}


void InsertarDespues ( TipoLista &P, TipoDato Dato, TipoDato Ref ){


    if ( !ListaVacia(P) ){

        TipoLista Q = P;

        while ( Q != NULL && Q -> Info != Ref ) Q = Q -> Liga;

            if ( Q -> Liga != NULL ){

                TipoLista X = new nodo;
                X -> Info = Dato;
                X -> Liga = Q -> Liga;
                Q -> Liga = X;
            } else cout << "\n\tLa referencia " << Ref << " no existe!\n"; 
    } else cout << "\n\tLista vacia, ingrese datos\n";
}

void EliminarInicio( TipoLista &P){

    if ( !ListaVacia(P) ){

        TipoLista Q = P;
        P = P -> Liga;
        delete Q;
    } else cout << "\n\tLista vacia. \n";
}

void EliminarUltimo( TipoLista &P ){

    if ( !ListaVacia(P) ){

        if ( P -> Liga == NULL ) delete P;
        else {
            TipoLista Q = P, T;
            while (Q->Liga != NULL){
                T = Q;
                Q = Q->Liga;
            } T->Liga = NULL; delete Q;
        }
    } else cout << "\n\tLista vacia. \n";
}

void EliminarNodo( TipoLista &P, TipoDato X ){

    if( !ListaVacia(P) ){

        TipoLista Q = P, T;

        while ( Q != NULL && Q -> Info != X ){

            T = Q;
            Q = Q -> Liga;
        }
            if ( Q != NULL ){

                if ( P == Q ) P = Q -> Liga;
                else T -> Liga = Q -> Liga;
                delete Q;
            } else cout << "\n\tLa referencia "<< X << " no existe!\n" << endl;
    } else cout << " \n\tLista vacia. \nNo existe " << X << endl;
}

void EliminarAntes( TipoLista &P, TipoDato X ){

    if( !ListaVacia(P) ){

        TipoLista Q = P, T, R;

        while( Q != NULL && Q -> Info != X ){
            R = T;
            T = Q;
            Q = Q -> Liga;
        }

        if( Q != NULL){
            if( T != NULL ){
                if( R == NULL ) P = T->Liga;
                else R->Liga = T->Liga;
                delete T;
            } else cout << "\nNo existe nodo antes del nodo con la referencia " << X << " (es el primer nodo).\n"<< endl;
        } else cout << "\n\tLa referencia "<< X << " no existe!\n" << endl;
    } else cout << "\n\tLista vacia, ingrese datos. \n";
}

void EliminarDespues( TipoLista &P, TipoDato X ){

    if( !ListaVacia(P) ){

        TipoLista Q = P, T;

        while ( Q != NULL && Q->Info != X ) {
            T = Q;
            Q = Q->Liga;
        }
        if( Q != NULL ){
            if( Q->Liga != NULL ){
                if ( P == Q ) {
                    T = P->Liga;
                    P->Liga = T->Liga;
                } else {
                    T = Q->Liga;
                    Q -> Liga = T -> Liga;
                }
                delete T;
            } else cout << "\n\tLa referencia " << X << " no tiene nodo siguiente!\n" << endl;
        } else cout << "\n\tLa referencia " << X << " no existe!\n" << endl;
    } else cout << "\n\tLista vacia, primero ingrese datos.\n";
}

void menuPrincipal(){

    TipoDato X, Ref, Opc;
    TipoLista P;
    InicializarLista (P);
    do {

    system ("cls");
    cout << " \n\t>> Listas simplemente enlasadas <<" << endl;
    cout << "\t\tby Neftali Leobardo Vazquez Castillo\n" << endl;
    cout << "\t\tMenu\n" << endl;
    cout << "1. Introducir valores manualmente, insertando al inicio. " << endl;
    cout << "2. Introducir valores impares del 1 al 99 insertando al inicio." << endl;
    cout << "3. Introducir valores impares del 1 al 99 insertando al final.\n" << endl;
    cout << "4. Mostrar Arreglo Recursivo. " << endl;
    cout << "5. Mostrar Arreglo Iterativo. " << endl;

    cout << "\n6. Limpiar Lista. " << endl;

    cout << "\n\tInsercion\n" << endl;
    cout << "7. Insertar al inicio. " << endl; 
    cout << "8. Insertar al final. " << endl;
    cout << "9. Insertar antes de la referencia. " << endl;
    cout << "10. Insertar despues de la referencia. " << endl;

    cout << "\n\tEliminacion\n" << endl;
    cout << "11. Eliminar al inicio. " << endl;
    cout << "12. Eliminar al final. " << endl;
    cout << "13. Eliminar nodo. " << endl;
    cout << "14. Eliminar antes de la referencia" << endl;
    cout << "15. Eliminar despues de la referenccia" << endl;

    cout << "\n\t0. Salir" << endl;

    cout << "\n\tOpcion: "; cin >> Opc;

    switch(Opc){

    case 1: CrearInicio(P); break;
    case 2: for (int i=1; i<=100; i=i+2) InsertarInicio( P,  i);
        Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 3: for (int i=1; i<=100; i=i+2) InsertarFinal( P,  i);
        Recorre_recursivo(P); cout<< endl; system("pause"); break;
    case 4: Recorre_recursivo(P); cout<< endl; system("pause"); break;
    case 5: Recorre_iterativo(P); cout<< endl; system("pause"); break;
    case 6: while ( P != NULL ) EliminarInicio(P); break;
    case 7: cout<< "Ingrese dato a insertar: "; cin >> X; InsertarInicio(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 8: cout<< "Ingrese dato a insertar: "; cin >> X; InsertarFinal(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 9: cout<< "Ingrese dato a insertar: "; cin >> X; cout<< "Ingrese referencia: "; cin>>Ref; InsertarAntes(P, X, Ref); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 10: cout<< "Ingrese dato a insertar: "; cin >> X; cout << "Ingrese referencia: "; cin>>Ref; InsertarDespues(P, X, Ref); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 11: EliminarInicio(P); Recorre_recursivo(P); cout<< endl; system("pause"); break;
    case 12: EliminarUltimo(P); Recorre_recursivo(P); cout<< endl; system("pause"); break;
    case 13: cout<< "Ingrese dato a eliminar: "; cin >> X; EliminarNodo(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 14: cout<< "Ingrese referencia: "; cin>>X; EliminarAntes(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;
    case 15: cout<< "Ingrese referencia: "; cin>>X; EliminarDespues(P, X); Recorre_recursivo(P); cout << endl; system("pause"); break;

    }
    } while (Opc != 0);
    system("cls");
    cout << "\n\n\tGracias por usar mi programa, puedes usarlo cuando gustes!\n" << endl;
    cout << "\t\t\t\tby ImNot Leo :D\n\n" << endl;
}

int main()
{
    menuPrincipal();
    return 0;
}

Enter fullscreen mode Exit fullscreen mode

Do your career a big favor. Join DEV. (The website you're on right now)

It takes one minute, it's free, and is worth it for your career.

Get started

Community matters

Top comments (0)

Image of Docusign

Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more