• Domingo 29 de Septiembre de 2024, 01:22

Autor Tema:  Re: Tengo Problemas Para Acomodar Una Lista Circular  (Leído 758 veces)

dooky_titay

  • Nuevo Miembro
  • *
  • Mensajes: 5
    • Ver Perfil
Re: Tengo Problemas Para Acomodar Una Lista Circular
« en: Domingo 10 de Octubre de 2004, 19:06 »
0
Amigos tengo un programa de lista enlazada el cual hicimos en equipo pero ahora tenemos que hacer uno de lista circular lo malo ;)  es que nos cambiaron a todos del equipo <_<  y mis compañeros pues no me ayudan  :angry:  chequen este codigo del programa espero que puedan darme unos tips para poder arreglar este codigo para que sea de lista circular, en verdad apreciaria mucho su ayuda
GRACIAS :hola:  :D

/* Operando y manteniendo una lista */
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

struct ListaNodo
{  /* estructura auto-referenciada */
   char dato;
   struct ListaNodo *proximoPtr;
};

typedef struct ListaNodo LISTANODO;
typedef LISTANODO *LISTANODOPTR;

void insertar(LISTANODOPTR *, char);
char suprimir(LISTANODOPTR *, char);
int EstaVacia(LISTANODOPTR);
void ImprimeLista(LISTANODOPTR);
void instrucciones(void);

main()
{
   LISTANODOPTR IniciaPtr = NULL;
   int eleccion=1;
   char item;

   instrucciones();  /* despliega el menu */

   while (eleccion != 3)
   {
      do
      {
        printf("? ");
        scanf("%d", &eleccion);
      }while(eleccion<1 || eleccion>3);
      switch (eleccion)
      {
         case 1: printf("Dame un caracter: ");
                 scanf("\n%c", &item);
                 insertar(&IniciaPtr, item);
                 ImprimeLista(IniciaPtr);
                 break;
         case 2: if (EstaVacia(IniciaPtr))
                 printf("La lista esta vacia.\n\n");
                 else
                 {
                    printf("Dame el caracter a ser suprimido: ");
                    scanf("\n%c", &item);
                    if (suprimir(&IniciaPtr, item))
                    {
                       printf("%c suprimido.\n", item);
                       ImprimeLista(IniciaPtr);
                    }
                    else printf("%c no encontrado.\n\n", item);
                 }
                 break;
         default:printf("Invalida eleccion.\n\n");
                 instrucciones();
                 break;
      }
   }
   printf("Fin de la ejecucion.\n");
   return 0;
}

/* Imprime las instrucciones */
void instrucciones(void)
{
   printf("Dame tu eleccion:\n"
          "   1 para insertar un elemento en la lista.\n"
          "   2 para suprimir un elementa desde la lista.\n"
          "   3 para terminar.\n");
}

/* Inserta a un nuevo valor en la lista ordenada*/
void insertar(LISTANODOPTR *sPtr, char valor)
{
   LISTANODOPTR nuevoPtr, anteriorPtr, actualPtr;

   nuevoPtr = malloc(sizeof(LISTANODO));

   if (nuevoPtr != NULL)/* es espacio disponible */
   {
      nuevoPtr->dato = valor;
      nuevoPtr->proximoPtr = NULL;
      anteriorPtr = NULL;
      actualPtr = *sPtr;
      while (actualPtr != NULL && valor > actualPtr->dato)
      {
         anteriorPtr = actualPtr;          /* camina a ...   */
         actualPtr = actualPtr->proximoPtr;  /* ... proximo node */
      }
      if (anteriorPtr == NULL)
      {
         nuevoPtr->proximoPtr = *sPtr;
         *sPtr = nuevoPtr;
      }
      else
      {
         anteriorPtr->proximoPtr = nuevoPtr;
         nuevoPtr->proximoPtr = actualPtr;
      }
      printf("\n%-25s%-25s%-25s","sPtr","anteriorPtr","actualPtr");
      printf("\n%-25p%-25p%-25p",sPtr,anteriorPtr,actualPtr);
      getch();
   }
   else printf("%c no insertado. No hay memoria disponible.\n", valor);
}

/* Suprimiendo un elemento de la lista */
char suprimir(LISTANODOPTR *sPtr, char valor)
{
   LISTANODOPTR anteriorPtr, actualPtr, tempPtr;

   if (valor == (*sPtr)->dato)
   {
      tempPtr = *sPtr;
      *sPtr = (*sPtr)->proximoPtr;  /* suprimiendo el nodo */
      free(tempPtr);             /* liberando la memoria del nodo suprimido */
      return valor;
   }
   else
   {
      anteriorPtr = *sPtr;
      actualPtr = (*sPtr)->proximoPtr;
      while (actualPtr != NULL && actualPtr->dato != valor)
      {
         anteriorPtr = actualPtr;          /* caminando a ...   */
         actualPtr = actualPtr->proximoPtr;  /* ... proximo node */
      }

      if (actualPtr != NULL)
      {
         tempPtr = actualPtr;
         anteriorPtr->proximoPtr = actualPtr->proximoPtr;
         free(tempPtr);
         return valor;
      }
   }
   return '\0';
}

/* Regresa un 1 si la lista esta vacia, 0 en cualquier otro caso */
int EstaVacia(LISTANODOPTR sPtr)
{
   return sPtr == NULL;
}

/* Imprime la lista */
void ImprimeLista(LISTANODOPTR actualPtr)
{
   if (actualPtr == NULL)
      printf("\nLa lista esta vacia.\n\n");
   else
   {
      printf("\nLa lista es:\n");
      while (actualPtr != NULL)
      {
         printf("%c --> ", actualPtr->dato);
         actualPtr = actualPtr->proximoPtr;
      }
      printf("NULL\n\n");
   }
}