Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Cpp en 11 Diciembre 2014, 03:26 am



Título: Lista Simplemente enlazada ayuda
Publicado por: Cpp en 11 Diciembre 2014, 03:26 am
Buenas noches tengo entendido que una lista simplemente enlazada y lista circular simple son casi parecidas, aca les dejo un TDA de una lista simplemente enlazada y quisiera que me den las modificaciones para que sea una lista circular simple muchas gracias

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

// Lista simplemente enlazada
struct tnodo{
   int dato;
   struct tnodo *siguiente;
};

// PROCEDIMIENTOS
// Creación de la Lista Simple
void crearLista(tnodo **lista)
{
   (*lista)=NULL;
}

bool listaVacia (tnodo *lista)
{
   if(lista == NULL)
   {
      return true;
   }
   else
   {
      return false;
   }   
}

bool listaLlena (tnodo *nodo)
{
   if(nodo == NULL)
   {
      return true;
   }
   else
   {
      return false;
   }
}

tnodo* crearNodo (int dato) //crea un nodo insertandole el dato recibido
{
   tnodo *nodo=(tnodo*)malloc(sizeof(tnodo));

   if (listaLlena(nodo)==false)
   {
      nodo->dato=dato;
      nodo->siguiente=NULL;
   }
   return (nodo);
}

// Agrega al final de la lista
void agregarFinal (tnodo **lista, int dato)
{
   struct tnodo *nodo,*aux;
    nodo = crearNodo(dato);
   if (*lista ==NULL)
   {
        *lista=nodo;
    }
    else
    {
        aux=*lista;
        while (aux->siguiente != NULL)
        {
            aux = (aux)->siguiente;         
        }
        aux->siguiente = nodo;   
    }
}

// Elimina un nodo al ultimo de la lista
void eliminarFin (tnodo **lista, int *sacado)
{
   tnodo *listaAux = *lista;
   tnodo *listaAux2 = *lista;
    if (listaVacia(*lista)==false)
   {
        while(listaAux->siguiente!=NULL)
        {
            listaAux2=listaAux2->siguiente;
            if(listaAux2->siguiente!=NULL)
            {
                listaAux= listaAux2;
            }
            else
            {
               
                listaAux=listaAux->siguiente;
                *sacado = (listaAux)->dato;
            }             
        }
        *lista=listaAux;   
    }
    else
    {
        *sacado=(*lista)->dato;
        *lista = NULL;
    }
}

// Devolver el dato del primer nodo
int verInicio(tnodo *lista)
{
   if (listaVacia(lista)==false)
   {
      //tnodo *nodo = lista;
      //return nodo->dato;
      return (lista)->dato;
   }else
    {
        printf("Lista Vacia \n");
    }   
}

// Devolver el dato del ultimo nodo
int verFinal(tnodo *lista)
{
   int dato;
    if(listaVacia(lista)==false)
   {
        while (lista->siguiente != NULL)
        {
            lista=(lista)->siguiente;         
        }
        return (lista)->dato;
    }else
    {
        printf("Lista Vacia \n");
    }   
}

// Muestra todos los elementos de la Lista */
void mostrarElementos(tnodo *lista){
    if(listaVacia (lista)==false)
   {
        while (lista!=NULL){
            printf("\n %d",lista->dato);
            lista=(lista)->siguiente;
        }
    }else
    {
        printf("Lista Vacia \n");
    }
}



Título: Re: Lista Simplemente enlazada ayuda
Publicado por: eferion en 11 Diciembre 2014, 07:29 am
Si quieres que una lista simplemente enlazada se convierta en circular basta con que "cierres" la lista, es decir, haz que el puntero del último elemento de la lista apunte al primero y listo.

Un saludo.