Created
November 11, 2014 04:57
-
-
Save jofese/7e64ffb756891b637dfa to your computer and use it in GitHub Desktop.
Implementacion de una lista enlazada circular en C++
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
Autor: Joel Fernandez | |
Curso: Estructura de Datos | |
Ejercicio: IMPLEMENTACION DE UNA LISTA CIRCULAR | |
Descripcion: funciones inserta, elimina, busca y elimina | |
IDE: CodeBlocks | |
Pagina Web: http://codebotic.blogspot.com | |
*/ | |
#include <iostream> | |
#include <cstdlib> | |
using namespace std; | |
struct nodo{ | |
int nro; //los datos seran de tipo entero | |
struct nodo *sgte; //puntero | |
}; | |
typedef struct nodo;//definimos a nodo como un tipo de variable | |
nodo *fin;//puntero que ira siempre al final de la lista | |
nodo *lista;//puntero que para nosotros apuntara a la cabeza de nuestra lista | |
void menu1(); //declaramos las funciones a usar | |
void insertarInicio(); | |
void insertarFinal(); | |
void mostrar(); | |
void buscarElemento(); | |
void eliminarElemento(); | |
void eliminarElementos(); | |
/* Funcion Principal | |
---------------------------------------------------------------------*/ | |
int main(void) | |
{ | |
lista = NULL; | |
int op; // opcion del menu | |
system("color 0a"); | |
do | |
{ | |
menu1(); | |
cin>>op; | |
switch(op) | |
{ | |
case 1: | |
insertarInicio(); | |
break; | |
case 2: | |
insertarFinal(); | |
break; | |
case 3: | |
cout<<"\n\n Lista Circular \n\n"; | |
mostrar(); | |
break; | |
case 4: | |
buscarElemento(); | |
break; | |
case 5: | |
eliminarElemento(); | |
break; | |
case 6: | |
eliminarElementos(); | |
break; | |
default: cout<<"OPCION NO VALIDA...!!!"; | |
break; | |
} | |
cout<<endl<<endl; | |
system("pause"); system("cls"); | |
}while(op!=7); | |
return 0; | |
} | |
//////////////////////MOSTRAR MENU/////////////////////////////// | |
void menu1() | |
{ | |
cout<<"\n\t\tLISTA ENLAZADA CIRCULAR\n\n"; | |
cout<<" 1. INSERTAR AL INICIO "<<endl; | |
cout<<" 2. INSERTAR AL FINAL "<<endl; | |
cout<<" 3. REPORTAR LISTA "<<endl; | |
cout<<" 4. BUSCAR ELEMENTO "<<endl; | |
cout<<" 5. ELIMINAR ELEMENTO 'V' "<<endl; | |
cout<<" 6. ELIMINAR ELEMENTOS CON VALOR 'V' "<<endl; | |
cout<<" 7. SALIR "<<endl; | |
cout<<"\n INGRESE OPCION: "; | |
} | |
//////////////////////INSERTAR AL INICIO////////////////////////// | |
void insertarInicio() | |
{ | |
nodo *nuevo; | |
nuevo=new struct nodo; | |
cout<<"\n***INSERTA AL INICIO*****\n"; | |
cout<<"\nINGRESE DATO:"; | |
cin>>nuevo->nro; | |
nuevo->sgte=NULL; | |
if(lista==NULL) | |
{ | |
cout<<"PRIMER ELEMENTO..!!!"; | |
lista=nuevo; | |
lista->sgte=lista; | |
fin=nuevo; | |
} | |
else | |
{ | |
nuevo->sgte = lista; | |
lista = nuevo; | |
fin->sgte = lista; | |
} | |
} | |
//////////////////INSERTAR AL FINAL///////////////////// | |
void insertarFinal() | |
{ | |
nodo *nuevo; | |
nuevo=new struct nodo; | |
cout<<"\n***INSERTA AL INICIO*****\n"; | |
cout<<"\nINGRESE DATO:"; | |
cin>>nuevo->nro; | |
nuevo->sgte=NULL; | |
if(lista==NULL) | |
{ | |
cout<<"PRIMER ELEMENTO..!!!"; | |
lista=nuevo; | |
lista->sgte=lista; | |
fin=nuevo; | |
} | |
else | |
{ | |
fin->sgte = nuevo; | |
nuevo->sgte = lista; | |
fin = nuevo; | |
} | |
} | |
//////////////////MOSTRAR TODOS LOS DATOS//////////////////////// | |
void mostrar() | |
{ nodo *aux; | |
aux=lista; | |
int i=1; | |
if(lista!=NULL) | |
{ | |
do | |
{ cout<<" "<<aux->nro; | |
aux = aux->sgte; | |
i++; | |
}while(aux!=lista); | |
} | |
else | |
cout<<"\n\n\tLista vacia...!"<<endl; | |
} | |
//////////////////BUSCAR ELEMENTO/////////////////////// | |
void buscarElemento() //esta funcion muestra la posicion del primer dato coincidente | |
//encontrado en la lista | |
{ | |
nodo *aux; | |
int i = 1, valor , flag = 0; | |
cout<<"\nINGRESE ELEMENTO A BUSCAR:"; | |
cin>>valor; | |
if(lista !=NULL) | |
{ | |
aux = lista; | |
do | |
{ | |
if(aux->nro == valor) | |
{ | |
cout<<"\n\n Encontrado en posicion "<< i <<endl; | |
flag=1; | |
} | |
else | |
{ | |
aux = aux->sgte; | |
i++; | |
} | |
}while(aux!=lista); | |
if(flag==0) cout<<"\n\n\tNumero no econtrado..!"<<endl; | |
} | |
else | |
cout<<"\n\n\tLista vacia...!"<<endl; | |
} | |
////////////////ELIMINAR ELEMENTO DETERMINADO////////////////////// | |
void eliminarElemento() | |
{ | |
nodo *aux, *r, *q; | |
int i = 1, flag = 0,valor; | |
cout<<"\n INGRESE ELEMENTO A ELIMINAR:"; | |
cin>>valor; | |
if(lista !=NULL) | |
{ | |
aux = lista; | |
do | |
{ | |
if(aux->nro == valor) | |
{ | |
if(aux==lista)//si es que el dato a eliminar es el primero | |
{ r=lista; | |
lista=lista->sgte; | |
aux=aux->sgte; | |
fin->sgte=lista; | |
r->sgte=NULL; | |
if(fin->sgte==NULL) | |
{ | |
lista==NULL; | |
aux==NULL; | |
delete(r); | |
cout<<"\nELEMENTO ELIMINADO...!!!\n"; | |
return; | |
} | |
else | |
{ | |
delete(r); | |
cout<<"\nELEMENTO ELIMINADO...!!!\n"; | |
return; | |
} | |
} | |
else | |
{ | |
if(aux==fin)//si es que el dato a eliminar es al que apunta a fin | |
{ | |
r=aux; | |
aux=aux->sgte; | |
q->sgte=aux; | |
fin=q; | |
r->sgte=NULL; | |
delete(r); | |
cout<<"\nELEMENTO ELIMINADO...!!!\n"; | |
return; | |
} | |
else | |
{ | |
r=aux; | |
aux=aux->sgte; | |
q->sgte=aux; | |
r->sgte=NULL; | |
delete(r); | |
cout<<"\nELEMENTO ELIMINADO...!!!\n"; | |
return; | |
} | |
} | |
flag=1; | |
} | |
else | |
{ q=aux; | |
aux = aux->sgte; | |
i++; | |
} | |
}while(aux!=lista); | |
if(flag==0) | |
cout<<"\n\n\tNumero no econtrado..!"<<endl; | |
} | |
else | |
cout<<"LISTA VACIA...!!!!"; | |
} | |
//////////////////////ELIMINAR REPETIDOS///////////////////// | |
void eliminarElementos() | |
{ | |
nodo *aux, *r, *q; | |
int flag = 0,valor; | |
cout<<"\n DATO REPETIDO A ELIMINAR:"; | |
cin>>valor; | |
if(lista !=NULL) | |
{ aux=lista; | |
while(aux->nro==valor)//si los primeros elementos son repetidos | |
if(aux==lista) //esta funcion borra a estos | |
{ | |
r=lista; | |
aux=lista->sgte; | |
lista=lista->sgte; | |
fin->sgte=lista; | |
r->sgte=NULL; | |
if(fin->sgte==NULL) | |
{ | |
lista==NULL; | |
aux==NULL; | |
delete(r); | |
flag=1; | |
} | |
else | |
{ | |
delete(r); | |
flag=1; | |
} | |
} | |
do | |
{ | |
if(aux->nro == valor) | |
{ | |
while(aux==lista) | |
{ | |
r=lista; | |
aux=lista->sgte; | |
lista=lista->sgte; | |
fin->sgte=lista; | |
r->sgte=NULL; | |
if(fin->sgte==NULL) | |
{ | |
lista==NULL; | |
aux==NULL; | |
delete(r); | |
} | |
else | |
delete(r); | |
} | |
if(aux==fin)//para si el elemento a borrar es apuntado por *fin | |
{ | |
r=aux; | |
aux=aux->sgte; | |
q->sgte=aux; | |
fin=q; | |
r->sgte=NULL; | |
delete(r); | |
} | |
else | |
{ | |
r=aux; | |
aux=aux->sgte; | |
q->sgte=aux; | |
r->sgte=NULL; | |
delete(r); | |
} | |
flag=1; | |
} | |
else | |
{ q=aux; | |
aux = aux->sgte; | |
} | |
}while(aux!=lista); | |
if(flag==0) | |
cout<<"\n\n\tNumero no econtrado..!"<<endl; | |
} | |
else | |
cout<<"LISTA VACIA...!!!!"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
buenas tardes me podran ayudar con este codigo me marca muchos errores y me faltan algunos elementos para agregar
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
struct datos
{
int num;
char ultimo;
struct datos *liga;
};
typedef struct datos nodo;
void *creamemoria(int n);
void recorrecursivo(nodo *p);
void recorreiterativo(nodo *p);
nodo *creanodo();
nodo *creainicio();
nodo *creafinal(nodo *p);
nodo *insertarinicio();
nodo *insertarfinal();
nodo *insertarantes();
nodo *insertardespues();
nodo *liberamemoria(nodo *p);
nodo *eliminaprimero(nodo *p);
nodo *eliminaultimo(nodo *p);
nodo *eliminanodox(nodo *p);
nodo *eliminanodoanterior(nodo *p);
nodo *busquedadesordenada(nodo *p);
void recorrecursivo(nodo *p);
void recorreiterativo(nodo *p);
nodo *creainiciolc();
nodo *creafinallc();
nodo *insertariniciolc();
nodo *insertarfinallc();
nodo *insertaranteslc();
nodo *insertardespueslc();
nodo *liberamemorialc(nodo *p);
nodo *eliminaprimerolc(nodo *p);
nodo *eliminaultimolc(nodo *p);
nodo *eliminanodoxlc(nodo *p);
nodo *eliminanodoanteriorlc(nodo *p);
nodo *busquedadesordenadalc(nodo *p);
int main()
{
nodo *q, *t, *p = NULL, *u;
int dat, i, ref, x;
char opcion1, opcion2, opcion3, opcion4, s = 'z', w = 'z', v = 'z', l = 'z', y = 'z';
while (w == 'z')
{
system ("CLS");
printf ("\n\n\t\t\t MENU DE LISTAS \n\n");
printf ("\n\n\t\t\t [a]. Listas Simplemente Ligadas \n");
printf ("\n\n\t\t\t [b]. Listas Circulares \n");
printf ("\n\n\t\t\t [c]. Listas Doblemente Ligadas \n");
printf ("\n\n\t\t\t [d]. Listas Doblemente Ligadas Circulares\n");
printf ("\n\n\t\t\t [e]. Salir \n\n");
printf ("\n\n\t\t\t Escoja una Opcion: ");
fflush (stdin);
scanf ("%c", &opcion1);
void *creamemoria(int n)
nodo *creanodo()
void recorrecursivo(nodo *p)
void recorreiterativo(nodo *p)
nodo *liberamemoria(nodo *p)
nodo *creainicio()
nodo *creafinal(nodo *p)
nodo *eliminaprimero(nodo *p){
}
nodo *eliminaultimo(nodo *p){
}