Implementación de Listas de Listas Encadenadas y Circulares en C++

Informática6,83 KB

Listas de Listas Encadenadas

A continuación se detallan las operaciones fundamentales de inserción y eliminación para una estructura de datos basada en listas de listas encadenadas implementadas mediante vectores de nodos.

Inserción en una Sublista Encadenada

bool Insertar(int aplista, int p, Nodo A)
{
    int i;
    if (ListaLlena())
    {
        return false;
    }
    else
    {
        i = Buscar_Nodo();
        lista[i].Dato(A.Dato());
        if (p == -1)
        {
            if (ListaVacia(aplista))
            {
                lista[aplista].ApuntadorAbajo(i);
                lista[i].ApuntadorAbajo(-1);
                lista[i].Apuntador(-1);
            }
            else
            {
                lista[i].ApuntadorAbajo(lista[aplista].ApuntadorAbajo());
                lista[i].Apuntador(-1);
                lista[aplista].ApuntadorAbajo(i);
            }
        }
        else
        {
            lista[i].ApuntadorAbajo(lista[p].ApuntadorAbajo());
            lista[p].ApuntadorAbajo(i);
            lista[p].Apuntador(-1);
        }
        return true;
    }
}

Eliminación en la Lista Principal

bool Eliminar(int p, Nodo &A)
{
    int i;
    if (ListaVacia())
    {
        return false;
    }
    else
    {
        if (p == -1)
        {
            A = lista[list];
            i = list;
            list = lista[list].Apuntador();
        }
        else
        {
            i = lista[p].Apuntador();
            A = lista[i];
            lista[p].Apuntador(lista[i].Apuntador());
        }
        Liberar_Nodo(i);
        return true;
    }
}

Eliminación en una Sublista Encadenada

bool Eliminar(int aplista, int p, Nodo &A)
{
    int i;
    if (ListaVacia(aplista))
    {
        return false;
    }
    else
    {
        if (p == -1)
        {
            A = lista[lista[aplista].ApuntadorAbajo()];
            i = lista[aplista].ApuntadorAbajo();
            lista[aplista].ApuntadorAbajo(lista[i].ApuntadorAbajo());
        }
        else
        {
            i = lista[p].ApuntadorAbajo();
            A = lista[i];
            lista[p].ApuntadorAbajo(lista[i].ApuntadorAbajo());
        }
        Liberar_Nodo(i);
        return true;
    }
}

Listas de Listas Circulares Encadenadas

En esta variante, los nodos de la estructura se interconectan de forma circular tanto en la lista principal como en sus niveles inferiores.

Inserción Ordenada en Sublista Circular

void InsertarOrdenadamente(int aplista, Nodo x)
{
    int i, ap;
    i = this->Primero(aplista);
    ap = -1;
    if (this->ListaVacia(aplista))
    {
        this->Insertar(aplista, -1, x);
    }
    else
    {
        while ((x.Dato() > Lista(i).Dato()) && (i != this->FinDeLista(aplista)))
        {
            ap = i;
            i = this->ProximoAbajo(i);
        }
        this->Insertar(aplista, ap, x);
    }
}

Inserción en la Lista Circular Principal

bool Insertar(int p, Nodo A)
{
    int i;
    if (ListaLlena())
    {
        return false;
    }
    else
    {
        i = BuscarNodo();
        lista[i].Dato(A.Dato());
        if (A.ApuntadorAbajo() == -1)
        {
            lista[i].ApuntadorAbajo(i);
        }
        else
        {
            lista[i].ApuntadorAbajo(A.ApuntadorAbajo());
            if (lista[i].ApuntadorAbajo() != i)
            {
                lista[A.Apuntador()].ApuntadorAbajo(i);
            }
        }
        if (p == -1)
        {
            if (ListaVacia())
            {
                lista[i].Apuntador(i);
                list = i;
            }
            else
            {
                lista[i].Apuntador(lista[list].Apuntador());
                lista[list].Apuntador(i);
            }
        }
        else
        {
            if (p == list)
            {
                lista[i].Apuntador(lista[list].Apuntador());
                list = i;
            }
            else
            {
                lista[i].Apuntador(lista[p].Apuntador());
            }
            lista[p].Apuntador(i);
        }
        return true;
    }
}

Inserción en Sublista Circular

bool Insertar(int aplista, int p, Nodo A)
{
    int i;
    if (ListaLlena())
    {
        return false;
    }
    else
    {
        i = BuscarNodo();
        lista[i].Dato(A.Dato());
        if (p == -1)
        {
            if (ListaVacia(aplista))
            {
                lista[aplista].ApuntadorAbajo(i);
                lista[i].ApuntadorAbajo(aplista);
                lista[i].Apuntador(-1);
            }
            else
            {
                lista[i].ApuntadorAbajo(lista[aplista].ApuntadorAbajo());
                lista[i].Apuntador(-1);
                lista[aplista].ApuntadorAbajo(i);
            }
        }
        else
        {
            lista[i].ApuntadorAbajo(lista[p].ApuntadorAbajo());
            lista[p].ApuntadorAbajo(i);
            lista[p].Apuntador(-1);
        }
        return true;
    }
}

Eliminación en la Lista Circular Principal

bool Eliminar(int p, Nodo &A)
{
    int i;
    if (ListaVacia())
    {
        return false;
    }
    else
    {
        if (p == -1)
        {
            A = lista[lista[list].Apuntador()];
            i = lista[list].Apuntador();
            if (A.ApuntadorAbajo() != i)
            {
                A.Apuntador(Ultimo(i));
            }
            else
            {
                A.ApuntadorAbajo(-1);
            }
            if (list == lista[list].Apuntador())
            {
                list = -1;
            }
            else
            {
                lista[list].Apuntador(lista[i].Apuntador());
            }
        }
        else
        {
            i = lista[p].Apuntador();
            A = lista[i];
            if (A.ApuntadorAbajo() != i)
            {
                A.Apuntador(Ultimo(i));
            }
            else
            {
                A.ApuntadorAbajo(-1);
            }
            lista[p].Apuntador(lista[i].Apuntador());
            if (i == list)
            {
                list = p;
            }
        }
        LiberarNodo(i);
        return true;
    }
}

Eliminación en Sublista Circular

bool Eliminar(int aplista, int p, Nodo &A)
{
    int i;
    if (ListaVacia(aplista))
    {
        return false;
    }
    else
    {
        if (p == -1)
        {
            A = lista[lista[aplista].ApuntadorAbajo()];
            i = lista[aplista].ApuntadorAbajo();
            lista[aplista].ApuntadorAbajo(lista[i].ApuntadorAbajo());
        }
        else
        {
            i = lista[p].ApuntadorAbajo();
            A = lista[i];
            lista[p].ApuntadorAbajo(lista[i].ApuntadorAbajo());
        }
        LiberarNodo(i);
        return true;
    }
}

Descargar

PDF Word HTML