Skip to content

Instantly share code, notes, and snippets.

@jofese
Created November 11, 2014 04:57
Show Gist options
  • Save jofese/7e64ffb756891b637dfa to your computer and use it in GitHub Desktop.
Save jofese/7e64ffb756891b637dfa to your computer and use it in GitHub Desktop.
Implementacion de una lista enlazada circular en C++
/*
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...!!!!";
}
@nauj640
Copy link

nauj640 commented May 30, 2019

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

@normi25
Copy link

normi25 commented Jul 4, 2022

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);

}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment