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

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
/* 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");
}
}