You are on page 1of 15

Facultad de Ingeniera y Arquitectura

Seminario
CURSO

Algoritmo y Estructura de Datos

DOCENTE

ERCE

Tema de listas enlazadas


Ejemplo de lista enlazada que Inserta, elimina, busca, reporta

#include <iostream>
#include <stdlib.h>
using namespace std;
struct nodo{
int nro;
struct nodo *sgte;
};
typedef struct nodo *Tlista;
void insertarInicio(Tlista &lista, int valor)
{
Tlista q;
q = new(struct nodo);
q->nro = valor;
q->sgte = lista;
lista = q;
}
void insertarFinal(Tlista &lista, int valor)
{
Tlista t, q = new(struct nodo);
q->nro = valor;
q->sgte = NULL;
if(lista==NULL)
{
lista = q;
}
else
{
t = lista;
while(t->sgte!=NULL)
{
t = t->sgte;
}

t->sgte = q;
}
}
int insertarAntesDespues()
{
int _op, band;
cout<<endl;
cout<<"\t 1. Antes de la posicion
cout<<"\t 2. Despues de la posicion

"<<endl;
"<<endl;

cout<<"\n\t Opcion : "; cin>> _op;


if(_op==1)
band = -1;
else
band = 0;
return band;
}
void insertarElemento(Tlista &lista, int valor, int pos)
{
Tlista q, t;
int i;
q = new(struct nodo);
q->nro = valor;
if(pos==1)
{
q->sgte = lista;
lista = q;
}
else
{
int x = insertarAntesDespues();
t = lista;
for(i=1; t!=NULL; i++)
{
if(i==pos+x)
{
q->sgte = t->sgte;
t->sgte = q;
return;
}
t = t->sgte;
}
}

cout<<" Error...Posicion no encontrada..!"<<endl;


}
void buscarElemento(Tlista lista, int valor)
{
Tlista q = lista;
int i = 1, band = 0;
while(q!=NULL)
{
if(q->nro==valor)
{
cout<<endl<<" Encontrada en posicion "<< i <<endl;
band = 1;
}
q = q->sgte;
i++;
}
if(band==0)
cout<<"\n\n Numero no encontrado..!"<< endl;
}
void reportarLista(Tlista lista)
{
int i = 0;
while(lista != NULL)
{
cout <<' '<< i+1 <<") " << lista->nro << endl;
lista = lista->sgte;
i++;
}
}
void eliminarElemento(Tlista &lista, int valor)
{
Tlista p, ant;
p = lista;
if(lista!=NULL)
{
while(p!=NULL)
{
if(p->nro==valor)
{
if(p==lista)
lista = lista->sgte;
else

ant->sgte = p->sgte;
delete(p);
return;
}
ant = p;
p = p->sgte;
}
}
else
cout<<" Lista vacia..!";
}
void eliminaRepetidos(Tlista &lista, int valor)
{
Tlista q, ant;
q = lista;
ant = lista;
while(q!=NULL)
{
if(q->nro==valor)
{
if(q==lista) // primero elemento
{
lista = lista->sgte;
delete(q);
q = lista;
}
else
{
ant->sgte = q->sgte;
delete(q);
q = ant->sgte;
}
}
else
{
ant = q;
q = q->sgte;
}
}// fin del while
cout<<"\n\n Valores eliminados..!"<<endl;
}
void menu1()
{
cout<<"\n\t\tLISTA ENLAZADA SIMPLE\n\n";

cout<<" 1. INSERTAR AL INICIO


"<<endl;
cout<<" 2. INSERTAR AL FINAL
"<<endl;
cout<<" 3. INSERTAR EN UNA POSICION
"<<endl;
cout<<" 4. REPORTAR LISTA
"<<endl;
cout<<" 5. BUSCAR ELEMENTO
"<<endl;
cout<<" 6. ELIMINAR ELEMENTO 'V'
"<<endl;
cout<<" 7. ELIMINAR ELEMENTOS CON VALOR 'V' "<<endl;
cout<<" 8. SALIR
"<<endl;
cout<<"\n INGRESE OPCION: ";
}
/*
Funcion Principal
---------------------------------------------------------------------*/
int main()
{
Tlista lista = NULL;
int op; // opcion del menu
int _dato; // elemenento a ingresar
int pos; // posicion a insertar
system("color 0b");
do
{
menu1(); cin>> op;
switch(op)
{
case 1:
cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
insertarInicio(lista, _dato);
break;
case 2:
cout<< "\n NUMERO A INSERTAR: "; cin>> _dato;
insertarFinal(lista, _dato );
break;
case 3:
cout<< "\n NUMERO A INSERTAR: ";cin>> _dato;
cout<< " Posicion : ";
cin>> pos;

insertarElemento(lista, _dato, pos);


break;
case 4:
cout << "\n\n MOSTRANDO LISTA\n\n";
reportarLista(lista);
break;
case 5:
cout<<"\n Valor a buscar: "; cin>> _dato;
buscarElemento(lista, _dato);
break;
case 6:
cout<<"\n Valor a eliminar: "; cin>> _dato;
eliminarElemento(lista, _dato);
break;
case 7:
cout<<"\n Valor repetido a eliminar: "; cin>> _dato;
eliminaRepetidos(lista, _dato);
break;
}
cout<<endl<<endl;
system("pause"); system("cls");
}while(op!=8);
system("pause");
return 0;
}

Nociones bsicas:

Uso de memoria dinmica en C/C++


Como sabemos, en lenguaje C/C++ , &x es la direccin donde se almacena
en memoria la variable x. Si p es un apuntador en C/C++ , *p es el
contenido de la localidad de memoria p. Si usamos C/C++ para
implementar listas ligadas, podemos usar estos apuntadores. Sin embargo,
primero analizaremos cmo asignar y liberar el almacenamiento en forma
dinmica y cmo se accesa al almacenamiento dinmico en C/C++ .
En C/C++ , una variable que debe contener la direccin en la memoria que
almacena un nmero entero se crea mediante la declaracin
int *p;
Recordemos que esta declaracin se divide en dos partes: la parte de tipo
int *, que indica que se trata de un apuntador a un entero; y la parte de
identificador, en este caso p.
Una vez declarada la variable p como un apuntador a un tipo especfico de
dato, debe ser posible crear dinmicamente un objeto de este tipo
especfico y asignar su direccin a p.
Esto se hace en C/C++ mediante la funcin de la biblioteca estndar
malloc(size). La fucnin malloc asigna de manera dinmica una parte de
memoria de tamao especificado en size y devuelve un apuntador a un
elemento de tipo char. Consideremos las siguientes declaraciones
extern char *malloc();
int *pi;
float *pr;
La palabra clave extern especifica que una variable o funcin tiene un
enlace externo. Esto significa que la variable o funcin a la que nos
referimos est definida en algn otro archivo fuente, o ms adelante en el
mismo archivo. Sin embargo, en C/C++ podemos usar esta palabra clave
extern con una cadena. La cadena indica que se est usando el convenio de
enlace de otro lenguaje para los identificadores que se estn definiendo.
Para los programas C++ la cadena por defecto es ``C++''.
Los enunciados
pi = (int *) malloc(sizeof(int));
pr = (float *) malloc(sizeof(float));
crean directamente la variable entera *pi y la variable real *pr. Estas se
denominan variables dinmicas. Al ejecutar estos enunciados, el operador
sizeof devuelve el tamao en bytes de su operando. Esto se usa para

conservar la independencia de mquina. Despus, malloc crea un objeto de


este tamao. Por tanto, malloc(sizeof(int)) asigna almacenamiento para un
entero, en tanto que malloc(sizeof(float)) asigna espacio necesario para un
real. De igual manera, malloc devuelve un apuntados al almacenamiento
que asigna. Este apuntador es al primer byte de este almacenamiento y es
de tipo char *. Para obligar al apuntador a que seale a un entero, usamos
el operador de clculo (int *) (float *).
El operador sizeof, devuelve un valor de tipo int, en tanto que la funcin
malloc espera un parmetro de tipo unsigned. Para hacer que correspondan,
debemos escribir:
pi=(int *)malloc((unsigned)(sizeof(int)));
1. Ejemplo: Comenta el cdigo
#include<iostream>
#include<malloc.h>
using namespace std;
void ingresos();
void listado();
struct nodo{
int codigo;
struct nodo *sgte;
};
struct nodo *ini, *fin;
main()
{
ini=fin=NULL;
for(int i=1;i<=2;i++)
{
ingresos();
}
listado();
system("pause");
}
void ingresos()
{
int codi;
struct nodo *nuevo;
nuevo=(struct nodo *)malloc(sizeof(struct nodo));
cout<<"Codigo: ";
cin>>codi;
nuevo->codigo=codi;
if (ini==NULL)
ini=nuevo;

else
fin ->sgte = nuevo;
fin = nuevo;
fin->sgte = NULL;
}
void listado()
{
struct nodo *aux;
aux=ini;
cout<<"LISTADO"<<endl;
cout<<"________"<<endl;
while(aux!=NULL)
{
cout<< aux-> codigo<<endl;
aux=aux->sgte;
}
}
Ahora completamos con otros ejemplos RETO.

2. A continuacin presentamos el cdigo bsico para ejemplificar una


lista:
#include<iostream>
#include<malloc.h>
using namespace std;
void ingresos();
void listado();
struct nodo{
int codigo;
struct nodo *sgte;
};
struct nodo *ini, *fin;
main()
{
ini=fin=NULL;
for(int i=1;i<=2;i++)
{
ingresos();
}
listado();
system("pause");
}
void ingresos()
{
int codi;
struct nodo *nuevo;
nuevo=(struct nodo *)malloc(sizeof(struct nodo));
cout<<"Codigo: ";
cin>>codi;
nuevo->codigo=codi;
if (ini==NULL)
ini=nuevo;
else
fin ->sgte = nuevo;
fin = nuevo;
fin->sgte = NULL;
}
void listado()
{
struct nodo *aux;
aux=ini;
cout<<"LISTADO"<<endl;
cout<<"________"<<endl;

while(aux!=NULL)
{
cout<< aux-> codigo<<endl;
aux=aux->sgte;
}
}

Preguntas al respecto:
a) Identifica la estructura lgica en la programacin
b) Evale el componente de struct nodo (---)
3. Ahora le presentamos el cdigo donde el nmero de componentes de
struct nodo se ha incrementado:
#include<iostream>
#include<malloc.h>
using namespace std;
void ingresos();
void listado();
struct nodo{
int codigo;
string apellido;
char sexo;
struct nodo *sgte;
};
struct nodo *ini, *fin;
main()
{
ini=fin=NULL;
for(int i=1;i<=2;i++)
{
ingresos();
}
listado();
system("pause");
}
void ingresos()
{
int codi;
char sex;

string ape;
struct nodo *nuevo;
nuevo=(struct nodo *)malloc(sizeof(struct nodo));
cout<<"Codigo: ";
cin>>codi;
nuevo->codigo=codi;
cout<<"F(Femenino)/M(Masculino):";
cin>>sex;
nuevo->sexo=sex;
cout<<"Apellido paterno:";
cin>>ape;
nuevo->apellido=ape;
if (ini==NULL)
{
ini=nuevo;
}
else
fin ->sgte = nuevo;
fin = nuevo;
fin->sgte = NULL;
}
void listado()
{
struct nodo *aux;
aux=ini;
cout<<"LISTADO"<<endl;
cout<<"________"<<endl;
while(aux!=NULL)
{
cout<< aux-> codigo<<endl;
cout<< aux-> sexo<<endl;
cout<< aux-> apellido<<endl;
aux=aux->sgte;
}
}

4. De la evaluacin del cdigo anterior responda:


a) Cules son los componentes de struct nodo?
b) Por qu no es necesario crear otros nodos?
c) Cul es la funcionalidad de *aux?
d) Qu permite malloc(sizeof(struct nodo)) ?
5. Siguiendo la estructura anterior, utilice las siguientes tablas para
implementar listas cuyos valores ingresen por teclado, realice el
reporte pertinente.
a) Listado de caractersticas de las antenas en mencin

b) Para el lisado de seales

c) Listado de alumnos de acuerdo a:


Cdigo / Apellidos / Ciclo/ Carrera profesional / Nmero de crditos
matriculados.

You might also like