Professional Documents
Culture Documents
LINK
El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con el siguiente nodo de la
lista. Si el nodo fuera el ltimo, este campo recibe como valor NIL (vaco).
A continuacin se muestra el esquema de una lista :
Juan
Luis
Mara
Sofa
NULL
}
return(top);
}
struct nodo *Crea_lista_inicio()/*donde p es de tipo puntero a nodo}*/
{ struct nodo *top;
/*top es un puntero al inicio de la lista de nodos*/
int respuesta;
top = NULL;
respuesta = 1;
while (respuesta)
{ p = new nodo;
cout << Dato;
cin >> p->dato;
if (top == NULL)
top = p;
else
{ p->link = top;
top = p;}
cout << Otro nodo? (si=1; no=0);
cin >> respuesta;
}
return(top);
}
Algoritmo para insertar un nodo a una lista que ya existe y que est apuntada por top
inserta_final_lista(struct nodo *top)
{ struct nodo *p, *q;
p = top;
while (p->link <> NULL)
p = p->link;
q = new nodo;
cout << Dato;
cin >> q->dato;
p->link = q;
q->link = NULL;
}
inserta_inicio_lista(top)
{
struct nodo *p;
p = new nodo;
cout << Dato;
cin >> p->dato;
p->link = top;
top = p;
}
Listas Circulares
Las listas circulares tienen la caracterstica de que el ltimo elemento de la lista apunta al primero. La
siguiente figura es una representacin grfica de una lista circular.
Juan
Luis
Mara
Sofa
if (p == top)
if (top->link=top)
top = NULL;
else
{ top = top->link;
q->link = top;}
else
r->link = p->link;
delete p;
p = top;
}
else
{ r = p;
p = p->link;}
}
while (p <> top);
}
NULL
NULL
FIN
Dado que las listas doblemente encadenadas se pueden recorrer de izquierda a derecha y vise versa
Es necesario mantener dos punteros indicando los extremos de la lista, el puntero TOP al inicio y el
puntero FIN al trmino.
Existen dos tipos de listas doblemente ligadas:
Listas dobles lineales. En este tipo de lista doble, tanto el puntero izquierdo del primer nodo
como el derecho del ltimo nodo apuntan a NULL.
Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del primer nodo
apunta al ltimo nodo de la lista, y el puntero derecho del ltimo nodo apunta al primer nodo de
la lista.
p =new nodo
p->dato= INFO
p->sig = NULL
p->ant = NULL
TOP = p
FIN = p
TOP5
NULL3
INFO2
NIL4
FIN6
p = new nodo
p->dato= INFO
p->sig = TOP
p->ant = NULL
TOP->ant = p
TOP = p
p = new nodo;
p->dato = INFO
p->sig = q->sig
p->ant = q
q->sig->ant = p
q->sig = p
p = new nodo
p->dato = INFO
p->sig = q
p->ant = q->ant
q->ant->sig = p
q->ant = p
Recorrido a la Derecha
P = top
repite
escribe(p->dato)
p = p->sig
hasta p = top->ant
Recorrido a la Izquierda
P = top
repite
escribe(p->dato)
p = p->ant
hasta p = top->sig
Despus de x
p = top
lee(x)
repite
si p->dato = x entonces
q = new nodo
leer(q->dato)
si p = top entonces
top = q
q->sig = p
q->ant = p->ant
p->sig->ant = q
p->ant = q
p = top
en caso contrario
p = p->sig
hasta p = top
p = top
lee(x)
repite
si p->dato = x
entonces
q = new nodo
leer(q->dato)
q->sig = p->sig
q->ant = p
p->sig->ant = q
p->sig = q
p = top
en caso contrario
p = p->sig
hasta p=top
1. Construya un algoritmo para crear una lista lineal que contenga valores numricos entregados por pantalla.
2. Suponga que ya tiene creada la lista anterior, cree un algoritmo que entregue como resultado la suma total
de los nmeros de los nodos y la cantidad de nodos en la lista.
3. Considere la lista que cre en el ejercicio 1, cree un algoritmo que entregue la suma total de los nmeros
mayores que 10 y la cantidad de nmeros menores o iguales a 10 que contiene la lista.
4. Considere que tiene una lista lineal que contiene como dato el nombre del mes y la cantidad total de das
que posee:
Enero 31
Febrero 28
............
Diciembre 31
nulo
Cree un algoritmo que recorra la lista anterior y cree una segunda lista slo con aquellos meses que
tengan 31 das.
5. Suponga que tiene una lista que contiene los alumnos que inscribieron la asignatura Informtica II en la
primera inscripcin de asignaturas. Luego del proceso de reinscripcin se gener una segunda lista con los
nuevos alumnos que se incorporaron al curso. Ambas listas contienen la misma informacin: el nombre del
alumno y su rut. Cree un algoritmo que agregue al final de la lista inicial los alumnos que se incorporaron al
curso.
6. Suponga que tiene un listado de alumnos de un curso dividido en dos listas lineales. Una lista contiene
todos los nombres de los hombres del curso ordenados en forma ascendente y, la otra lista contiene los
nombres de las mujeres ordenado en forma ascendente. Escriba un algoritmo que genere una lista
resultante con los nombres de todas las personas del curso (hombres y mujeres) ordenado en forma
ascendente.
7.
Un Chef tiene todas los tipos de comidas y los ingredientes que estas contienen, almacenadas en una
estructura utilizando listas encadenadas de la siguiente forma:
Comida
Pavo Nogado
Lomo Mignon
Championes 7
Carne
Tocino 1
Asado Alemn
Pavo 3
Nueces 1
Carne 9
Ingredientes
Suponga:
La lista de comidas contiene el nombre de la comida, un link a la lista de sus ingredientes y un link a la
siguiente comida.
La lista de ingredientes contiene el nombre del ingrediente, la cantidad necesaria y un link al siguiente
ingrediente.
Una comida puede tiene al menos un ingrediente.
Se pide:
a. Defina formalmente las estructuras de datos necesarias para representar estas listas. (5 ptos).
b. Al chef no le queda stock de carne. Escriba un algoritmo que calcule la cantidad de carne que
necesita comprar el chef para poder preparar todas sus comidas.(20 ptos)
c. Calcule el orden del algoritmo. (5 ptos).
8. En una empresa se tiene la informacin almacenada en listas enlazadas. La informacin del trabajador est
en una lista con la siguiente estructura:
struct nodo {
char nombre[30];
char cargo[20];
int
nro_cargas;
struct nodo *link;
}
Adems, existe una segunda lista que contiene para cada cargo el sueldo base correspondiente, con la
siguiente estructura:
struct nodo1 {
char cargo[20];
int
sueldo_base;
struct nodo *link;
}
a. Cree una tercera lista (nombre del trabajador, sueldo) con el sueldo de cada trabajador, si se sabe
que:
sueldo = sueldo_base + nro_cargas*5000
b. Defina todas las estructuras de datos que ocupar.
Supuestos: La lista de trabajadores no est vaca.
Todos los cargos aparecen en la lista de sueldo base por cargo (y no repetido).
9. En un colegio se tienen dos cursos de pre-kinder (A y B) cuyos alumnos se encuentran almacenados en
dos listas lineales que contienen el nombre del alumno y su edad en meses. Existe diferencia entre los
cursos producto de que hay nios de edades muy diferentes que estn juntos, por lo tanto, se ha decidido
reestructurar los cursos de manera tal que en uno de ellos estn los alumnos de hasta 53 meses ( 41/2
aos) y en el otro los alumnos que tengan ms de 53 meses. Se pide:
a) Escribir un algoritmo que genere dos listados (listas encadenadas) de los alumnos separados por
edad. (Nota: considere que inicialmente tiene dos listas y debe entregar como resultado otras dos
listas diferentes). (18 ptos.)
b) Calcular el orden de ejecucin del algoritmo. (5 ptos.)
10. Se tiene una lista lineal doblemente encadenada que contiene nmeros enteros positivos (>0):
a) Construya un algoritmo que elimine de la lista aquellos nodos que contengan nmeros pares. (15
ptos.)
La lista puede estar vaca y puede tener o no nmeros pares.
b) Diga cual es el orden de ejecucin del algoritmo y por qu. (6 ptos.)
11. Suponga que tiene un listado de n alumnos y su nota final almacenada en una estructura tipo lista
simplemente encadenada:
c) Construya un algoritmo que calcule el promedio del curso y entregue la cantidad de alumnos con
nota menor a 4,0 y la cantidad de alumnos con nota mayor o igual a 4,0. (12 ptos.)
d) Especifique claramente la estructura del nodo de la lista. (3 ptos).
e) Calcule el orden de ejecucin del algoritmo (5 ptos.)
Se debe definir el tamao mximo de la pila, adems de un apuntador (tope: entero) que indica la cima
o el tope de la pila, es decir, dnde se debe insertar el prximo elemento. La representacin grfica de
una pila es la siguiente:
Arreglo : tamao mximo n=5
tope=1
DATO1
Al utilizar arreglos para implementar pilas, tenemos la limitante de espacio de memoria reservada. Una
vez establecido un mximo de capacidad para la pila, ya no es posible insertar ms elementos.
Inicialmente el tope debe estar en un extremo del arreglo. De acuerdo a esto existen dos formas de
implementar el arreglo: creciente hacia abajo o creciente hacia arriba:
0
1
.
.
n-3
n-2
n-1
/////////////
/////////////
push
pop
0
1
.
.
n-3
n-2
n-1
Creciente
hacia abajo
Pila vacia: tope = 0
Pila llena : tope = n
////////////////
push
////////////////
Creciente
hacia arriba
Pila vaca: tope = n-1
Pila llena : tope = -1
pop
Operaciones en Pilas
Tipo
Operacin
Constructora
Modificadora
Operacin
Dominio
Codominio
Especificacin
Descripcin
InicPila
AdicPila
Modificadora
ElimPila
Pila,
TipoP
Pila
Pila
Pila
Pila
Pila *InicPila(void)
void AdicPila (Pila *p, TipoP
dato)
void ElimPila (Pila *p)
Pila
TipoP
VaciaPila
Pila
int
Analizadora
LlenaPila
Pila
int
Analizadora
InfoPila
Analizadora
Destructora
DestruirPila
Pila
TPila *InicPila( )
{ TPila *p = (TPila *) malloc (sizeof(TPila));
p->tope = 0; /*Se tiene una pila vaca*/
return(p);
}
int VaciaPila(TPila *p)
{ if (p->tope == 0) return(TRUE);
else return(FALSE);
}
int LlenaPila(TPila *p)
{ if (p->tope == TAM) return TRUE;
else return FALSE;
}
void AdicPila(TPila *p, TipoP dato)
{ if (LlenaPila(p))
printf("Error, Pila Llena\n");
else {
p->info[p->tope] = dato;
p->tope++;
}
}
void ElimPila(TPila *p)
{ if (VaciaPila(p))
printf ("Error, Pila Vaca\n");
else
p->tope--;
/*Elimina el elemento del tope*/
}
TipoP InfoPila(TPila *p)
{ if (VaciaPila(p))
{ printf ("Error, Pila Vaca\n");
return(0);}
else
return(p->info[p->tope-1]);
}
void DestruirPila(TPila *p)
{ free(p);
}
void main()
{ TipoP valor;
TPila *pp;
char operacion;
int respuesta =1;
pp = InicPila();
while(respuesta)
{
printf("Ingrese operacion: \n");
printf(" 1: pila vacia\n");
printf(" 2: ingresa un elemento\n");
printf(" 3: devuelve el elemento del tope\n");
printf(" 4: elimina un elemento\n");
printf(" 5: pila llena\n");
printf("Operacion: "); scanf("%c",&operacion);
getchar();
switch(operacion) {
case '1':
printf("Esta vacia?(1:si; 0:no): %i \n", VaciaPila(pp));
break;
case '2':
printf("ingrese elemento: ");
scanf("%c",&valor);
getchar();
AdicPila(pp,valor);
break;
case '3':
if(!VaciaPila(pp)) printf("El elemento del tope es %c \n", InfoPila(pp));
break;
case '4':
ElimPila(pp);
break;
case '5':
printf("Esta llena? (1:si; 0:no): %i \n", LlenaPila(pp));
break;
}
printf("Desea ingresar otra operacion (0/1): ");
scanf("%i",&respuesta);
getchar();
}
}
Ejercicios:
1.- Leer una secuencia arbitraria de caracteres e imprimirla en orden inverso.
2.- Revisa parntesis de una expresin matemtica.
Ej. [[2+3]*5+ {(23*12)/(15-{2*4})}]
Solucin:
- Cada vez que encuentra un parntesis abierto, lo guarda en la pila.
- Cuando encuentra un parntesis cerrado saca el elemento del tope de la pila y los compara. Si son del
mismo tipo, contina la revisin, si no, existe un error en la expresin.
- Cuando termina de recorrer la cadena que contiene la expresin, la pila debe quedar vaca, si no,
existe error en la expresin.
Existen tres mtodos diferentes para representar una cola mediante arreglos:
Primer Mtodo:
Se define un arreglo de tamao mximo y un apuntador al frente de la cola (primer elemento) y uno al
final de la cola (prximo espacio libre). Cada vez que se inserta un nuevo elemento se incrementa el
apuntador del final hasta que se llega al tamao mximo ms uno. Cada vez que se extrae un elemento
el apuntador al frente debe aumentar en uno hasta que frente es igual a final.
La representacin grfica de una cola es la siguiente:
Arreglo : tamao mximo 4
0
A
frente =0
1
B
2
Final = 2
3
El problema con este tipo de representacin es que si se inserta el tamao mximo de elementos del
arreglo, no se podr seguir insertando aunque se hayan extrado elementos.
Ejemplo: Realice en forma grfica la siguiente secuencia de operaciones: in(A), in(B), in(C), out(A),
in(D), out(B), out(C), in(E), in(F). Registre cada vez los valores de frente y final.
La cola est vaca si frente = final y la cola est llena si final = tam_max. En esta representacin tanto
la insercin de elementos como la eliminacin son de O(1).
Segundo Mtodo:
Una forma de solucionar este problema es desplazar los datos hacia arriba cada vez que se extrae un
elemento. De esta forma el dato a extraer siempre estar en la primera posicin del arreglo.
Ejemplo: Realice en forma grfica la siguiente secuencia de operaciones: in(A), in(B), in(C), out(A),
in(D), out(B), out(C), in(E), in(F). Registre cada vez los valores de frente y final.
El problema que surge con este mtodo es que la insercin es de O(1) y la extraccin se incrementa a
O(n) por tener que hacer los corrimientos.
Tercer Mtodo:
Este mtodo consiste en implementar la cola utilizando un buffer circular, en este caso tanto la
insercin como la extraccin de elementos se mantienen de O(1).
El apuntador frente siempre est en la posicin donde se debe extraer el prximo elemento y el
apuntador final estar en la posicin donde se debe insertar el prximo elemento, Si final est en la
posicin del tamao mximo del arreglo debe ser inicializado en el primer elemento del arreglo de
manera de continuar circularmente, esto siempre y cuando frente no sea igual al primer elemento, en
cuyo caso la cola estar llena. El apuntador frente debe ser incrementado cada vez que se extrae un
elemento e inicializado en la primera posicin del arreglo cuando se extraiga elemento de la ltima
posicin del arreglo, esto siempre y cuando frente sea distinto de final en cuyo caso la cola estar vaca.
El problema con esta representacin es que la condicin frente = final se aplica tanto para la cola llena
como para la cola vaca. Para solucionar esto se utiliza una variable para almacenar el nmero de
elementos de la cola. Si la variable es igual a cero la cola est vaca, cuando la variable es igual al
tamao mximo del arreglo la cola est llena.
Operaciones
Tipo
Operacin
Constructora
Modificadora
Operacin
Modificadora
InicCola
AdicCola
Dominio
Codominio
Especificacin
Descripcin
Cola
Cola
ElimCola
Cola,
TipoC
Cola
Cola
Cola*InicCola(void)
void AdicCola (Cola *p,
TipoC dato)
void ElimCola (Cola *c)
Analizadora
InfoCola
Cola
TipoC
Analizadora
VaciaCola
Cola
int
Analizadora
LlenaCola
Cola
int
Destructora
DestruirCola
Cola
La estructura de datos y funciones para representar las colas por el mtodo 2 se muestran a
continuacin:
#include <stdio.h>
#include <alloc.h>
#include <conio.h>
#define TAM 20
#define TRUE 1
#define FALSO 0
typedef int TipoC;
typedef struct {
TipoC info[TAM];
int frente, final;
}TCola;
TCola *InicCola()
{ TCola *c = (TCola *) malloc (sizeof(TCola));
c->final = 0;
c->frente = 0;
return(c);
}
int VaciaCola(TCola *c){
if ((c->final == 0))
return(TRUE);
else
return(FALSE);
}
int LlenaCola(TCola *c)
{ if ((c->final == TAM))
return(TRUE);
else
return(FALSE);
}
TipoC InfoCola(TCola *c)
{ if (!VaciaCola(c))
return (c.elementos[c.frente]);
}
void AdicCola(TCola *c, TipoC dato)
{ if (!LlenaCola(c))
c->info[c->final++] = dato;
}
void ElimCola(TCola *c)
{ int i=0;
if (!VaciaCola(c))
{ while (i < c->final-1)
c->info[i] = c->info[i+1];
c->final--; }
}