Logo Studenta

EJERCICIOS VIRTUALES - Listas Circulares en C

¡Estudia con miles de materiales!

Vista previa del material en texto

Curso: Estructura de Datos 
EJERCICIOS – SEMANA 3 
Listas Circulares en C++ 
En una lista enlazada circular, el primer y el último nodo están unidos juntos. 
Esto se puede hacer tanto para listas enlazadas simples como para las 
doblemente enlazadas. Para recorrer una lista enlazada circular podemos 
empezar por cualquier nodo y seguir la lista en cualquier dirección hasta que se 
regrese hasta el nodo original. Desde otro punto de vista, las listas enlazadas 
circulares pueden ser vistas como listas sin comienzo ni fin. Este tipo de listas 
es el más usado para dirigir buffers para “ingerir” datos, y para visitar todos los 
nodos de una lista a partir de uno dado. 
 
#include<iostream> 
using namespace std; 
 
 
//************************** NODO *********************************// 
typedef struct Nodo 
{ 
 
 int dato; 
 
 struct Nodo *sgt; 
 
}TNodo; 
//*****************************************************************// 
 
 
//************************ LISTA **********************************// 
typedef struct LE 
{ 
 
 TNodo *inicio; 
 
}TLE; 
 
//*****************************************************************// 
 
 
//************************* CREA NODO *****************************// 
TNodo *crearNodo(int x) 
{ 
 
 TNodo *nodo = (TNodo*)malloc(sizeof(TNodo)); 
 
 nodo->dato = x; 
 
 nodo->sgt = NULL; 
 
 Curso: Estructura de Datos 
 return nodo; 
 
} 
 
//************************ CREA LISTA *****************************// 
TLE *crearLista() 
{ 
 
 TLE *lista = (TLE*)malloc(sizeof(TLE)); 
 lista->inicio = NULL; 
 
 return lista; 
 
} 
 
 
//************************ INSERTAR *******************************// 
void Insertar(TLE *lista, int x) 
{ 
 
 TNodo *nodo = crearNodo(x); 
 
 if(lista->inicio == NULL) 
 
 lista->inicio = nodo; 
 
 else 
 
 nodo->sgt = lista->inicio->sgt; 
 
 lista->inicio->sgt = nodo; 
 
 
} 
 
 
//*********************** ELIMINAR ********************************// 
void Eliminar(TLE *lista, int dato) 
{ 
 
 TNodo *p = lista->inicio; 
 
 TNodo *ant = NULL; 
 
 int encontrado=0; 
 
 do 
 { 
 if( p->dato == dato) 
 { 
 Curso: Estructura de Datos 
 
 cout<<" "<<p->dato; 
 
 encontrado=1; 
 } 
 
 else 
 
 { 
 
 ant=p; 
 
 p=p->sgt; 
 
 } 
 } 
 
 while(!encontrado && p!=lista->inicio); 
 
 
 if(lista->inicio != NULL) 
 { 
 
 if (ant==NULL) 
 lista->inicio=(lista->inicio)->sgt; 
 
 else 
 
 
 ant->sgt=p->sgt; 
 
 free(p); 
 
 } 
 
} 
 
 
//************************ BORRAR *********************************// 
void Borrar(TLE *lista) 
{ 
 
 TNodo *p = NULL; 
 
 while(lista->inicio->sgt != lista->inicio) 
 { 
 
 p = lista->inicio->sgt; 
 
 lista->inicio->sgt = p->sgt; 
 Curso: Estructura de Datos 
 
 free(p); 
 
 } 
 
} 
 
 
//********************** REPORTAR ********************************// 
void Reportar(TLE *lista) 
{ 
 TNodo *p = lista->inicio;; 
 
 cout<<" Lista -> "; 
 
 do 
 { 
 
 cout<<" "<<p->dato<<" -> "; 
 
 p = p->sgt; 
 
 } 
 while(p!=lista->inicio); 
 
 cout<<"Lista"; 
 
 cout<<endl<<endl; 
 
 system("pause"); 
 
 cout<<endl; 
} 
 
 
//*********************** ESTA VACIA ******************************// 
void Vacia(TLE *lista) 
{ 
 
 if(lista->inicio == NULL) 
 
 cout<<endl<<" - La Lista Esta Vacia !!! "<<endl; 
 
 else 
 
 cout<<endl<<" - La Lista No Esta Vacia !!! "; 
 
 cout<<endl<<endl; 
 
 system("pause"); 
 Curso: Estructura de Datos 
 
 cout<<endl; 
 
} 
 
//*****************************************************************// 
int main() 
{ 
 
 system("color f2"); 
 
 TLE *L=crearLista(); 
 
 int N,E,i=0; 
 
 int opcion; 
 
 cout<<endl<<"\t----------------------------------------------------------------- "; 
 cout<<endl<<"\t| LISTAS ENLAZADAS CIRCULARES |"; 
 cout<<endl<<"\t----------------------------------------------------------------- "<<endl; 
 
 cout<<endl<<endl; 
 cout<<" MENU LISTAS CIRCULARES"<<endl; 
 cout<<" ---------------------- "; 
 
 while(1) 
 { 
 cout<<endl<<endl; 
 cout<<" ---------------------------- "<<endl; 
 cout<<" | 1. Insertar |"<<endl; 
 cout<<" | 2. Eliminar Elemento |"<<endl; 
 cout<<" | 3. Borrar Lista |"<<endl; 
 cout<<" | 4. Mostrar Lista |"<<endl; 
 cout<<" | 5. Lista Esta Vacia |"<<endl; 
 cout<<" | 6. Salir |"<<endl; 
 cout<<" ----------------------------- "<<endl; 
 
 do 
 
 { 
 
 cout<<endl<<endl<<" -> Ingrese Opcion"<<endl; 
 cout<<" ---------------> "; 
 
 cin>>opcion; 
 
 } 
 
 while(opcion < 1 || opcion > 6); 
 
 Curso: Estructura de Datos 
 
 switch(opcion) 
 { 
 case 1: 
 
 i++; 
 
 cout<<endl<<" - Ingrese ["<<i<<"] elemento: "; 
 
 cin>>N; 
 
 Insertar(L,N); 
 
 break; 
 
 case 2: 
 
 cout<<endl<<" - Ingrese Elemento a Eliminar: "; 
 
 cin>>E; 
 
 Eliminar(L,E); 
 
 break; 
 
 case 3: 
 
 Borrar(L); 
 
 cout<<endl<<endl; 
 
 cout<<" - Se Elimino La Lista Correctamente... "; 
 
 cout<<endl<<endl; 
 
 system("pause"); 
 
 cout<<endl; 
 
 break; 
 
 case 4: 
 
 cout<<endl; 
 
 Reportar(L); 
 
 cout<<endl; 
 
 break; 
 Curso: Estructura de Datos 
 
 case 5: 
 
 Vacia(L); 
 
 break; 
 
 case 6: 
 
 exit(1); 
 
 default: 
 cout<<endl<<endl; 
 
 cout<<" La Opcion No es Valida !!!!!!!!!:"; 
 } 
 
} 
 
 cout<<endl<<endl; 
 
 system("PAUSE"); 
 
 return EXIT_SUCCESS; 
 
} 
 
//*****************************************************************//

Continuar navegando