-
-
Save jofese/7e64ffb756891b637dfa to your computer and use it in GitHub Desktop.
| /* | |
| 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...!!!!"; | |
| } |
amigo tienes un pequeño erro en la parte de buscar elemento, ya que queda en un bucle se soluciona muy facilmente
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;
}
lo tenias asi y la solucion es q cuando consiga el valor buscado sigua asignandole a aux el siguiente nodo
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;
aux = aux->sgte;
i++;
}
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;
}
de esta manera pero de resto esta MUY MUY bien tu codigo y mil gracias
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);
//fflush (stdin);
printf ("\n\n\n");
switch (opcion1)
{
case 'a':
s = 'z';
while (s == 'z')
{
system ("CLS");
printf ("\n\n\t\t\t LISTAS SIMPLEMENTE LIGADAS \n\n");
printf ("\n\n\t\t [a]. Crea Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [b]. Crea Nodo al Final de la Lista \n");
printf ("\n\n\t\t [c]. Insertar Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [d]. Insertar Nodo al Final de la Lista \n");
printf ("\n\n\t\t [e]. Insertar Antes de un Nodo de la Lista \n");
printf ("\n\n\t\t [f]. Insertar Despues de un Nodo de la Lista \n");
printf ("\n\n\t\t [g]. Eliminar el Primer Nodo de la Lista \n");
printf ("\n\n\t\t [h]. Eliminar el Ultimo Nodo de la Lista \n");
printf ("\n\n\t\t [i]. Eliminar un Nodo con Informacion X \n");
printf ("\n\n\t\t [j]. Eliminar el Nodo Anterior al Nodo con Informacion X \n");
printf ("\n\n\t\t [k]. Busqueda en Lista Desordenada \n");
printf ("\n\n\t\t [l]. Recorre Recursivo \n");
printf ("\n\n\t\t [m]. Recorre Iterativo \n");
printf ("\n\n\t\t [n]. Libera la Memoria \n");
printf ("\n\n\t\t [o]. Salir \n\n");
printf ("\n\n\t\t\t Escoja una Opcion: ");
fflush (stdin);
scanf ("%c", &opcion2);
//fflush (stdin);
printf ("\n\n\n");
switch (opcion2)
{
case 'a':
nodo *liberamemoria(nodo *p);
nodo *creainicio();
break;
case 'b':
nodo *creafinalnodo(nodo *p);
break;
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
nodo *eliminaprimero(nodo *p);
break;
case 'h':
nodo *eliminaultimo(nodo *p);
break;
case 'i':
case 'j':
case 'k':
case 'l':
recorrecursivo(p);
getch();
break;
case 'm':
recorreiterativo(p);
getch();
break;
case 'n':
if (p != NULL)
{
p = liberamemoria(p);
p = NULL;
printf ("\n\n\n\t\t\t Memoria Libre !!!");
}
else
printf ("\n\n\n\t\t La lista esta vacia !!!");
getch();
break;
case 'o':
if (p != NULL)
{
p = liberamemoria(p);
p = NULL;
}
s = 'x';
break;
default:
printf ("\n\n\t\t Opcion INVALIDA !!!");
getch();
break;
}
}
break;
case 'b':
v = 'z';
while (v == 'z')
{
system ("CLS");
printf ("\n\n\t\t\t LISTAS CIRCULARES \n\n");
printf ("\n\n\t\t [a]. Crea Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [b]. Crea Nodo al Final de la Lista \n");
printf ("\n\n\t\t [c]. Insertar Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [d]. Insertar Nodo al Final de la Lista \n");
printf ("\n\n\t\t [e]. Insertar Antes de un Nodo de la Lista \n");
printf ("\n\n\t\t [f]. Insertar Despues de un Nodo de la Lista \n");
printf ("\n\n\t\t [g]. Eliminar el Primer Nodo de la Lista \n");
printf ("\n\n\t\t [h]. Eliminar el Ultimo Nodo de la Lista \n");
printf ("\n\n\t\t [i]. Eliminar un Nodo con Informacion X \n");
printf ("\n\n\t\t [j]. Eliminar el Nodo Anterior al Nodo con Informacion X \n");
printf ("\n\n\t\t [k]. Busqueda en Lista Desordenada \n");
printf ("\n\n\t\t [l]. Recorre Recursivo \n");
printf ("\n\n\t\t [m]. Recorre Iterativo \n");
printf ("\n\n\t\t [n]. Libera la Memoria \n");
printf ("\n\n\t\t [o]. Salir \n\n");
printf ("\n\n\t\t\t Escoja una Opcion: ");
scanf ("%c", &opcion3);
fflush (stdin);
printf ("\n\n\n");
switch (opcion3)
{
case 'a':
p = liberamemoria(p);
p = creainicio();
break;
case 'b':
p = liberamemoria(p);
p = creafinal(p);
break;
case 'c':
p = liberamemoria(p);
nodo*insertarinicio();
break;
case 'd':
p = liberamemoria(p);
nodo *insertarfinal();
break;
case 'e':
p = liberamemoria(p);
nodo *insertarantes();
break;
case 'f':
p = liberamemoria(p);
nodo *insertardespues();
break;
case 'g':
nodo *eliminaprimero(nodo *p);
break;
case 'h':
nodo *eliminaultimo(nodo *p);
break;
case 'i':
nodo *eliminanodox(nodo *p);
break;
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
if (p != NULL)
{
p = NULL;
printf ("\n\n\n\t\t\t Memoria Libre !!!");
}
else
printf ("\n\n\n\t\t La lista esta vacia !!!");
getch();
break;
case 'o':
if (p != NULL)
{
}
v = 'x';
break;
default:
printf ("\n\n\t\t Opcion INVALIDA !!!");
getch();
break;
}
}
break;
case 'c':
l = 'z';
while (l == 'z')
{
system ("CLS");
printf ("\n\n\t\t\t LISTAS DOBLEMENTE LIGADAS \n\n");
printf ("\n\n\t\t [a]. Crea Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [b]. Crea Nodo al Final de la Lista \n");
printf ("\n\n\t\t [c]. Insertar Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [d]. Insertar Nodo al Final de la Lista \n");
printf ("\n\n\t\t [e]. Insertar Antes de un Nodo de la Lista \n");
printf ("\n\n\t\t [f]. Insertar Despues de un Nodo de la Lista \n");
printf ("\n\n\t\t [g]. Eliminar el Primer Nodo de la Lista \n");
printf ("\n\n\t\t [h]. Eliminar el Ultimo Nodo de la Lista \n");
printf ("\n\n\t\t [i]. Eliminar un Nodo con Informacion X \n");
printf ("\n\n\t\t [j]. Eliminar el Nodo Anterior al Nodo con Informacion X \n");
printf ("\n\n\t\t [k]. Busqueda en Lista Desordenada \n");
printf ("\n\n\t\t [l]. Recorre Recursivo \n");
printf ("\n\n\t\t [m]. Recorre Iterativo \n");
printf ("\n\n\t\t [n]. Libera la Memoria \n");
printf ("\n\n\t\t [o]. Salir \n\n");
printf ("\n\n\t\t\t Escoja una Opcion: ");
scanf ("%c", &opcion2);
fflush (stdin);
printf ("\n\n\n");
switch (opcion2)
{
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
if (p != NULL)
{
p = NULL;
printf ("\n\n\n\t\t\t Memoria Libre !!!");
}
else
printf ("\n\n\n\t\t La lista esta vacia !!!");
getch();
break;
case 'o':
if (p != NULL)
{
p = NULL;
}
l = 'x';
break;
default:
printf ("\n\n\t\t Opcion INVALIDA !!!");
getch();
break;
}
}
break;
case 'd':
y = 'z';
while (y == 'z')
{
system ("CLS");
printf ("\n\n\t\t\t LISTAS DOBLEMENTE LIGADAS CIRCULARES \n\n");
printf ("\n\n\t\t [a]. Crea Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [b]. Crea Nodo al Final de la Lista \n");
printf ("\n\n\t\t [c]. Insertar Nodo al Inicio de la Lista \n");
printf ("\n\n\t\t [d]. Insertar Nodo al Final de la Lista \n");
printf ("\n\n\t\t [e]. Insertar Antes de un Nodo de la Lista \n");
printf ("\n\n\t\t [f]. Insertar Despues de un Nodo de la Lista \n");
printf ("\n\n\t\t [g]. Eliminar el Primer Nodo de la Lista \n");
printf ("\n\n\t\t [h]. Eliminar el Ultimo Nodo de la Lista \n");
printf ("\n\n\t\t [i]. Eliminar un Nodo con Informacion X \n");
printf ("\n\n\t\t [j]. Eliminar el Nodo Anterior al Nodo con Informacion X \n");
printf ("\n\n\t\t [k]. Busqueda en Lista Desordenada \n");
printf ("\n\n\t\t [l]. Recorre Recursivo \n");
printf ("\n\n\t\t [m]. Recorre Iterativo \n");
printf ("\n\n\t\t [n]. Libera la Memoria \n");
printf ("\n\n\t\t [o]. Salir \n\n");
printf ("\n\n\t\t\t Escoja una Opcion: ");
scanf ("%c", &opcion4);
fflush (stdin);
printf ("\n\n\n");
switch (opcion4)
{
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'g':
case 'h':
case 'i':
case 'j':
case 'k':
case 'l':
case 'm':
case 'n':
if (p != NULL)
{
p = NULL;
printf ("\n\n\n\t\t\t Memoria Libre !!!");
}
else
printf ("\n\n\n\t\t La lista esta vacia !!!");
getch();
break;
case 'o':
if (p != NULL)
{
p = NULL;
}
y = 'x';
break;
default:
printf ("\n\n\t\t Opcion INVALIDA !!!");
getch();
break;
}
}
break;
case 'e':
w = 'x';
break;
default:
printf ("\n\n\t\t Opcion INVALIDA !!!");
getch();
break;
}
}
}
void *creamemoria(int n)
{
int *p;
printf ("\n\n BYTES a reservar: %i", n);
p = (int *) malloc (n);
if (p == NULL)
{
puts ("Lo siento no hay suficiente memoria !!!");
getch();
exit (1);
}
return (p);
}
nodo *creanodo()
{
return (nodo*)creamemoria(sizeof(nodo));
}
void recorrecursivo(nodo *p)
{
if (p != NULL)
{
printf ("[ %d ]", p->num);
if (p->liga != NULL)
printf ("[ %p ] --> ", p->liga);
else
printf ("[ NULL ]");
if (p->liga != NULL)
recorrecursivo(p->liga);
}
else
printf ("\n\n\n\t\t\t La lista esta vacia !!!");
}
void recorreiterativo(nodo *p)
{
nodo *q;
q = p;
if (q != NULL)
{
for (q = p; q != NULL; q = q->liga)
{
printf ("[ %d ]", q->num);
if (q->liga != NULL)
printf ("[ %p ] --> ", q->liga);
else
printf ("[ NULL ]");
}
}
else
printf ("\n\n\t\t La lista esta vacia !!!");
}
nodo *liberamemoria(nodo *p)
{
nodo *q = NULL;
while (p != NULL)
{
q = p;
p = p->liga;
free(q);
}
return (p);
}
nodo *creainicio()
{
int i = 1, num;
nodo *p, *q;
printf ("\n Introduzca el primer valor entero: ");
fflush (stdin);
scanf ("%d", &num);
//fflush (stdin);
if (i == 1)
{
p = creanodo();
p->num = num;
p->liga = NULL;
printf ("\n\n\nNumero: %5d", p->num);
printf ("\nLiga: %p", p->liga);
getch();
do
{
printf ("\n\n\n Introduzca otro valor entero, si desea finalizar entre 99: ");
fflush (stdin);
scanf ("%d", &num);
//fflush (stdin);
i = num;
if (i != 99)
{
q = creanodo();
q->num = num;
q->liga = p;
p = q;
printf ("\n\n\nNumero: %5d", q->num);
printf ("\nLiga: %p", q->liga);
getch();
}
}while (i != 99);
}
return (p);
}
nodo *creafinal(nodo *p)
{
int num;
nodo *q, *nuevo;
q = p;
printf ("\n Introduzca el ultimo valor entero: ");
fflush (stdin);
scanf ("%d", &num);
nuevo = creanodo();
nuevo->num = num;
nuevo->liga = NULL;
while (q ->liga != NULL){
q = q->liga;
}
q->liga = nuevo;
//}
printf ("[ %d ]", num);
printf ("[ %p ] --> ", q->liga);
getch();
return (p);
}
nodo *eliminaprimero(nodo *p){
int c=0,n=0;
nodo *primernodo,*q;
primernodo = p;
if (p != NULL){
recorreiterativo(p);
printf ("\n\n Eliminando primer nodo!! ");
while (primernodo->liga != NULL){
primernodo = primernodo->liga;
c++;
}
if (c == 0){
p = liberamemoria(p);
p = NULL;
printf ("\n\n\t\t La lista esta vacia !!!");
}
else{
//printf ("\n\n %i ",c);
primernodo = p;
q = p;
q = primernodo->liga;
while (q->liga != NULL) {
q = q ->liga;
//printf ("\n\n %i %d %p",c,primernodo->num,primernodo->liga,&primernodo);
//free(primernodo->num);
//free(primernodo->liga);
//free(primernodo);
}
}
printf ("\n\n ");
recorreiterativo(p);
}
else
printf ("\n\n\t\t La lista esta vacia !!!");
getch();
return (p);
}
nodo *eliminaultimo(nodo *p){
int c=0,n=0;
nodo *ultimonodo;
ultimonodo = p;
if (p != NULL){
recorreiterativo(p);
printf ("\n\n Eliminando ultimo nodo!! ");
while (ultimonodo ->liga != NULL){
ultimonodo = ultimonodo->liga;
c++;
}
if (c == 0){
p = liberamemoria(p);
p = NULL;
printf ("\n\n\t\t La lista esta vacia !!!");
}
else{
ultimonodo = p;
while (n < c - 1 ) {
ultimonodo = ultimonodo->liga;
n++;
}
ultimonodo->liga = NULL;
printf ("\n\n ");
recorreiterativo(p);
}
}
else
printf ("\n\n\t\t La lista esta vacia !!!");
getch();
return (p);
}
Alguna idea de como puedo insertar ordenadamente los elementos a la lista circular? ^^'