Sunteți pe pagina 1din 34

Estructuras de Datos - Lista de Ejercicios

Listas Enlazadas

LISTA ENLAZADA: Usando la implementacion basica del TAD TLE


visto en clase, con las operaciones basicas de insertar, reportar,y eliminar,
realizar las siguientes tareas:
Nota: Todos los procedimientos que usted implemente agreguelos a su
implementacion basica, de modo que el TAD TLE sea mas completo. No se
olvide de probar en el main el buen funcionamiento de su procedimiento.
1. Implementar un procedimiento para insertar un dato en orden
ascendente en una lista enlazada. Es decir, el nodo que representa el
dato debe ser insertado en una posicion tal que al recorrer la lista los
nodos se recorran de menor a mayor respecto del dato.
2. Ahora hagalo en orden descendente.
3. Hemos visto inserciones en orden y al final de la lista. Supongamos,
que los nodos tienen una posicion relativa 0, 1, ...n 1, donde n es el
numero de elementos en la lista. Implemente una procedimiento que
inserte un dato en una posicion dada. Si la posicion es 0 tiene que
insertarlo al inicio. El ultimo nodo esta en la posicion n 1, por lo
tanto si se le pide insertar en n 1, el dato debe ser insertado antes
del ultimo y el ultimo avanza. Note que es posible insertar un dato
en n, eso hara que el dato se inserte al final de todos.
4. Implemente un procedimiento que inserte un dato de modo similar al
insertar basico, al final de la lista.
Pero ahora, no se debe permitir insertar datos repetidos, si un dato ya
esta almacenado entonces la lista no vara.
5. Implemente un procedimeiento para eliminar un nodo dado un orden
relativo.
6. Implemente una funcion que devuelva el numero de elementos de una
lista enlazada.
7. Con las funciones ya implementadas, desarrolle un programa que
utilice un menu de opciones con las operaciones siguientes:
1. Crear lista.
2. Insertar al final.
1
3. Insertar en una posicion.
4. Eliminar de una posicion.
5. Reportar.
6. Obtener numero de elementos.
7. Salir
El usuario debe eliger la opcion y el programa interactua con el
usuario de acuerdo a cada operacion.

PARA PENSAR UN POQUITO MA S!!!

2
8. Implemente una funcion que dada una lista enlazada l, devuelva otra
lista l1 con solamente los nodos que almacenan un dato impar.
9. Implemente una funcion que dada una lista enlazada l, devuelva otra
lista l1 con solamente los nodos que almacenan un dato mayor que el
promedio.

LISTA DOBLEMENTE ENLAZADA: Las listas doblemente


enlazadas son similares a las listas en- lazadas simples ya vistas, pero
ahora los nodos tienen 2 punteros, uno al nodo siguiente y otro al
nodo anterior.
10. Implemente la estructura necesaria para crear una lista doblemente
enlazada (TLE2). Una lista doblemente enlazada, ademas del puntero al
inicio p1, debe tener un puntero al final p2, de modo que la lista se pueda
recorrer de inicio a fin y de fin a inicio.
11. Agregue las operaciones
basicas de: Insertar un
dato al inicio de la lista.
Insertar un dato al final de la lista.
Eliminar un nodo de una posicion i, como
en el caso del TLE. Insertar en orden
ascendente.
Insertar en orden
descentede.
Reportar nodos.

EJERCICIO 7
#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

do
{
menu1();
cin>>op;

switch(op)
{
case 1:

insertarInicio();
break;
case 2:

insertarFinal();
break;
case 3:

buscarElemento();
break;

case 4:

eliminarElemento();
break;

case 5:

cout<<"\n\n Lista
Circular \n\n";

mostrar();
break;
case 6:

eliminarElementos();
break;

default:
cout<<"OPCION
NO VALIDA...!!!";
break;

cout<<endl<<endl;

system("pause");
system("cls");

}while(op!=7);

return 0;
}

void menu1()
{

cout<<" 1.
CREAR LISTA
"<<endl;
cout<<" 2.
INSERTAR AL
FINAL
"<<endl;
cout<<" 3. BUSCAR
ELEMENTO X
"<<endl;
cout<<" 4.
ELIMINAR
ELEMENTO 'V'
"<<endl;
cout<<" 5.
REPORTAR LISTA
"<<endl;
cout<<" 6.
OBTENER
NUMERO DE
ELEMENTOSX '
"<<endl;
cout<<" 7. SALIR
"<<endl;

cout<<"\n
INGRESE OPCION:
";

//////////////////////INSER
TAR AL
INICIO/////////////////////
/////
void insertarInicio()
{
nodo *nuevo;
nuevo=new struct
nodo;

cout<<"\n***INSER
TA 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;
}

}
//////////////////INSERT
AR AL
FINAL/////////////////////
void insertarFinal()
{
nodo *nuevo;
nuevo=new struct
nodo;

cout<<"\n***INSER
TA 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;
}
}
//////////////////MOSTR
AR 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\tNumer
o no
econtrado..!"<<endl;

}
else

cout<<"\n\n\tLista
vacia...!"<<endl;

}
////////////////ELIMINA
R 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<<"\nELEMEN
TO
ELIMINADO...!!!\n"
;

return;
}
else
{

delete(r);

cout<<"\nELEMEN
TO
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<<"\nELEMEN
TO
ELIMINADO...!!!\n"
;

return;
}
else
{

r=aux;

aux=aux->sgte;
q-
>sgte=aux;
r-
>sgte=NULL;

delete(r);

cout<<"\nELEMEN
TO
ELIMINADO...!!!\n"
;

return;
}
}
flag=1;
}
else
{ q=aux;
aux =
aux->sgte;
i++;
}
}while(aux!
=lista);

if(flag==0)

cout<<"\n\n\tNumer
o no
econtrado..!"<<endl;

}
else
cout<<"LISTA
VACIA...!!!!";
}
//////////////////////ELIMI
NAR
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\tNumer
o no
econtrado..!"<<endl;
}
else

cout<<"LISTA
VACIA...!!!!";
}

Ejercicio 11
#include <iostream>
#include <stdlib.h>

// @Enderson
Vizcaino -
EndersonTutoriales.c
om

using namespace std;

int op;
int sw=1;
int enter;
int datoBus;
int swDB=0;

struct nodo{
int dato;
nodo *siguiente;
nodo *anterior;
};

nodo
*primero=NULL;
nodo
*ultimo=NULL;

void
ingresar_datos();
void mostrar();
void buscar();
void eliminar();

int main(){
do{

system("/usr/bin/clea
r");
//system("c
ls");
cout<<"1.
Ingresar dato al
inicio de la
lista"<<endl;

cout<<"insertar
dato al finalde la
lista"<<endl;
cout<<"2.
Eliminar dato
posicion"<<endl;

cout<<"3.insertar
dato forma
ascendente y
descendente"<<endl;
cout<<"4-
reportar
nodos"<<endl;
cout<<"0.
salir"<<endl;
cin>>op;

switch(op){
case
1:
ingresar_datos();

system("/usr/bin/clea
r");

//system("cls");

break;
case
2:

eliminar();

cout<<"\nPulse 1
para continuar... ";

cin>>enter;

system("/usr/bin/clea
r");

swDB=0;

break;

//system("cls");

//system("PAUS
E");

break;
case
3:

break;
case
4:

mostrar();

cout<<"\nPulse 1
para continuar... ";

cin>>enter;

system("/usr/bin/clea
r");
case
0:

sw=0;

break;

default:

cout<<"Opcion
no valida..";
cout<<"\nPulse 1
para continuar... ";

cin>>enter;

system("/usr/bin/clea
r");

//system("cls");
}
} while(sw!=0);

return 0;
}
/*
5
primero=5;
ultimo=5;
5 <- 5 -> 5

7
primero=5;
ultimo=7;
7 <- 5 -> <- 7 -> 5

9
primero=7;
ultimo=9;
9 <- 5 -> <- 7 -> <- 9
-> 5
*/

void ingresar_datos()
{
nodo
*nuevo_nodo = new
nodo();
cout<<"Digite el
dato que desea
guardar: ";

cin>>nuevo_nodo-
>dato;

if(primero==NULL){

primero=nuevo_nodo
;
primero-
>siguiente=primero;
primero-
>anterior=primero;

ultimo=primero;

}else{
ultimo-
>siguiente=nuevo_no
do;

nuevo_nodo-
>siguiente=primero;

nuevo_nodo-
>anterior=ultimo;

ultimo=nuevo_nodo;
primero-
>anterior=ultimo;
}
}

void mostrar(){
nodo *aux = new
nodo();
aux = primero;
if(primero!
=NULL){
do{

cout<<"["<<aux-
>dato<<"] ";

aux=aux-
>siguiente;
}
while(aux!=primero);
}else{
cout<<"
La Lista Esta
VACIA!! \n";
}
}

void eliminar(){
nodo *buscar =
new nodo();
nodo
*nodo_eliminar =
new nodo();
buscar =
primero;

nodo_eliminar=NUL
L;

cout<<"Digite el
dato a eliminar: ";
cin>>datoBus;

if(primero!
=NULL){
do{
if(buscar-
>dato==datoBus){

cout<<"Dato
encontrado! \n";

if(buscar==primero){

primero =
primero->siguiente;

primero-
>anterior=ultimo;

ultimo-
>siguiente=primero;

}else
if(buscar==ultimo){

ultimo =
ultimo->anterior;

primero-
>anterior = ultimo;

ultimo-
>siguiente =
primero;

}else{
nodo_eliminar-
>siguiente=buscar-
>siguiente;

buscar-
>siguiente-
>anterior=nodo_elim
inar;

swDB=1;
}

nodo_eliminar=busc
ar;

buscar=buscar-
>siguiente;
}
while(buscar!
=primero &&
swDB==0);

if(swDB==0){

cout<<"El dato
buscado no se
encontro \n";
}else{

free(nodo_eliminar);
}
}else{
cout<<"
La Lista Esta
VACIA!! \n";
}
}

S-ar putea să vă placă și