Está en la página 1de 79

ALGORITMICA Y PROGRAMACION POR OBJETOS II

Nivel 9
Estructuras lineales
encadenadas

Marcela Hernández Hoyos


Qué vamos a aprender en este
nivel:
n Estructuras lineales encadenadas para modelar grupos
de elementos de cardinalidad indefinida:
ƒ Listas simplemente encadenadas
ƒ Listas doblemente encadenadas
o Algoritmos de manipulación de listas:
ƒ Búsqueda
ƒ Inserción.
ƒ Supresión
p Nuevos componentes de Interfaz Usuario:
ƒ Layouts: FlowLayout, GridBagLayout
ƒ JDialog, JTextArea, JComboBox, JRadioButton
q Utilidades:
ƒ Manejo y formateo de fechas en java
Estructuras lineales:
LISTAS
Caso de Estudio: notas de los
estudiantes de un curso
Interfaz usuario

Cardinalidad
indefinida
=
Número
variable de
estudiantes
Modelo del mundo con una
estructura contenedora
Modelo del mundo con una
estructura contenedora

estudiantes
Representación gráfica de un
objeto de tipo Curso con una
estructura contenedora
: Curso
0 1 2 3 …

estudiantes =

: Estudiante

nombre = “Alicia”
nota = 4.5
Modelo del mundo con una
estructura contenedora
Representación gráfica de un
objeto de tipo Curso con una lista
simplemente encadenada

: Estudiante
nombre = “Alicia”
: Curso nota = 4.5
siguiente
cabeza


Modelo del mundo con una lista
simplemente encadenada
Qué son las listas?

• Son estructuras de datos de uso muy


común en los programas que manejan
grupos de elementos de cardinalidad
indefinida.
• Pueden manejar la noción de orden en
el caso de secuencias ordenadas de
valores.
Ventajas
• Eficiencia en caso de inserción o
eliminación:
• Desplazamiento de elementos en
memoria:
• En arreglos: nos toca hacerlo “a mano”
• En vectores (ArrayList): lo hace java (pero no
es lo mas eficiente)
• Anidamientos internos (diferentes de la
secuencia dentro de un arraylist)
Listas simplemente
encadenadas
Modelo del mundo con una lista
doblemente encadenada

Encadenamiento sencillo
Declaración en java de la clase Curso

public class Curso


{
// Primer estudiante de la lista
private Estudiante cabeza;

}
Creación de un curso nuevo
: Curso
public class Curso cabeza =
{
cabeza = null;
Al comienzo,
cabeza es null
}

: Curso

cabeza = null
Declaración en java de la clase
Estudiante
public class Estudiante
{
// El nombre del estudiante
private String nombre;

// La nota del estudiante


private double nota;

// El siguiente estudiante de la lista


private Estudiante siguiente;
}


Creación de un nuevo Estudiante
public Estudiante( String nombreE, double notaE )
{
nombre = nombreE;
nota = notaE; : Estudiante
siguiente = null; nombre = “Alicia” Al comienzo,
nota = 4.5 siguiente es null
} siguiente = null


siguiente del último
elemento de la lista
SIEMPRE es null
Operaciones sobre listas
simplemente encadenadas
• Recorrido
• Ej.: Calcular el promedio del curso, contar cuántos
estudiantes están por encima del promedio

• Búsqueda
• Ej.: Cambiar la nota de un estudiante dado el nombre

• Inserción (al inicio / al final de la lista)


• Insertar un nuevo estudiante

• Eliminación
• Eliminar un estudiante
Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
R// Recorriendo la lista, acumulando las notas,
dividiendo al final por el número de estudiantes
Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
R// Recorriendo la lista, acumulando las notas,
dividiendo al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
R// Recorriendo la lista, acumulando las notas,
dividiendo al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


R// Se empieza por la cabeza, se avanza hasta
llegar al final
Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
R// Recorriendo la lista, acumulando las notas,
dividiendo al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


R// Se empieza por la cabeza, se avanza hasta
llegar al final

• Cómo se avanza de un elemento a otro?


Calcular el promedio del curso
• Cómo se calcula el promedio de las notas
de los estudiantes?
R// Recorriendo la lista, acumulando las notas,
dividiendo al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


R// Se empieza por la cabeza, se avanza hasta
llegar al final

• Cómo se avanza de un elemento a otro?


R// Pidiendo al elemento su “siguiente”
Calcular el promedio del curso
• Cómo se calcula el promedio de las notas de los
estudiantes?
R// Recorriendo la lista, acumulando las notas, dividiendo
al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


R// Se empieza por la cabeza, se avanza hasta llegar al
final

• Cómo se avanza de un elemento a otro?


R// Pidiendo al elemento su “siguiente”

• Cómo se sabe que se llegó al final?


Calcular el promedio del curso
• Cómo se calcula el promedio de las notas de los
estudiantes?
R// Recorriendo la lista, acumulando las notas, dividiendo
al final por el número de estudiantes

• Cómo se recorre la lista de estudiantes?


R// Se empieza por la cabeza, se avanza hasta llegar al
final

• Cómo se avanza de un elemento a otro?


R// Pidiendo al elemento su “siguiente”

• Cómo se sabe que se llegó al final?


R// Porque “siguiente” es null
Calcular el promedio del curso
: Curso

cabeza

• Se empieza por el estudiante de la cabeza


• Mientras no se haya llegado al final:
– Se le pide la nota al estudiante actual y se acumula
– Se le pide su “siguiente” y ese pasa a ser el estudiante
actual
• Al final, se divide el acumulado de notas por el
número de estudiantes
Calcular el promedio del curso
public double promedio( )
{ Se empieza por el
int cuantosEstudiantes = 0; estudiante de la
double suma = 0; cabeza

Estudiante estudianteActual = cabeza;


while( estudianteActual != null )
{
cuantosEstudiantes++;
suma += estudianteActual.darNota( );
estudianteActual = estudianteActual.darSiguiente( );
}

return suma / cuantosEstudiantes;


}
Calcular el promedio del curso
public double promedio( )
{
int cuantosEstudiantes = 0;
double suma = 0;
Mientras no se
haya llegado al
Estudiante estudianteActual = cabeza;
final
while( estudianteActual != null )
{
cuantosEstudiantes++;
suma += estudianteActual.darNota( );
estudianteActual = estudianteActual.darSiguiente( );
}

return suma / cuantosEstudiantes;


}
Calcular el promedio del curso
public double promedio( )
{
int cuantosEstudiantes = 0;
double suma = 0;

Estudiante estudianteActual = cabeza; Se le pide la nota


while( estudianteActual != null ) al estudiante
{ actual y se
cuantosEstudiantes++; acumula
suma += estudianteActual.darNota( );
estudianteActual = estudianteActual.darSiguiente( );
}

return suma / cuantosEstudiantes;


}
Calcular el promedio del curso
public double promedio( )
{
int cuantosEstudiantes = 0;
double suma = 0;

Estudiante estudianteActual = cabeza; Se le pide su


while( estudianteActual != null ) “siguiente” y ese
{ pasa a ser el
cuantosEstudiantes++; estudiante actual
suma += estudianteActual.darNota( );
estudianteActual = estudianteActual.darSiguiente( );
}

return suma / cuantosEstudiantes;


}
Calcular el promedio del curso
public double promedio( )
{
int cuantosEstudiantes = 0;
double suma = 0;

Estudiante estudianteActual = cabeza;


while( estudianteActual != null )
{
cuantosEstudiantes++;
suma += estudianteActual.darNota( );
estudianteActual = estudianteActual.darSiguiente( );
}

return suma / cuantosEstudiantes; Al final, se divide


} el acumulado de
notas por el
número de
estudiantes
Contar cuántos estudiantes sacaron más de 3.0

public int cuantosPasaron( )


{

}
Buscar la posición de un estudiante dado el nombre
(retorna -1 si no existe)

public int buscarPosicion( )


{

}
Cambiar la nota de un estudiante dado su nombre.
public void cambiar nota ( String nombre, double notaNueva )
{

}
Devolver la lista de estudiantes en un arraylist.
public ArrayList darEstudiantes ( )
{

}
Insertar un estudiante
• Cómo se inserta un estudiante en la lista?
R// Primero se crea, luego se “encadena” en la
posición que se desea insertar

: Curso

cabeza


Insertar un elemento al inicio de la
lista
1. Se crea el objeto

: Estudiante
nombre = “Alicia” Al comienzo,
nota = 4.5 siguiente es null
siguiente = null

: Curso

cabeza


Insertar un elemento al inicio de la
lista
1. Se crea el objeto
2. Se encadena con el que era antes el primero

: Estudiante
nombre = “Alicia” siguiente ya no es
null, ahora apunta al
nota = 4.5
que era antes el
: Curso siguiente primero de la lista
cabeza


Insertar un elemento al inicio de la
lista
1. Se crea el objeto
2. Se encadena con el que era antes el primero
3. Se cambia la “cabeza” de la lista para que ahora sea el
nuevo elemento
: Estudiante
nombre = “Alicia”
nota = 4.5
: Curso siguiente
cabeza


Insertar un elemento al inicio de la
lista
public void agregarEstudianteInicio( String nombre, double nota )
{
Estudiante nuevoEstudiante = new Estudiante( nombre, nota );
nuevoEstudiante.cambiarSiguiente( cabeza );
cabeza = nuevoEstudiante;
}

Se crea el objeto
Insertar un elemento al inicio de la
lista
public void agregarEstudianteInicio( String nombre, double nota )
{
Estudiante nuevoEstudiante = new Estudiante( nombre, nota );
nuevoEstudiante.cambiarSiguiente( cabeza );
cabeza = nuevoEstudiante;
}

Se encadena con
el que era antes el
primero
Insertar un elemento al inicio de la
lista
public void agregarEstudianteInicio( String nombre, double nota )
{
Estudiante nuevoEstudiante = new Estudiante( nombre, nota );
nuevoEstudiante.cambiarSiguiente( cabeza );
cabeza = nuevoEstudiante;
}

Se cambia la
“cabeza” de la
lista para que
ahora sea el
nuevo elemento
Insertar un elemento al final de la
lista
public void agregarEstudianteFinal( String nombre, double nota )
{

}
Eliminar un estudiante
• Cómo se elimina un estudiante de la lista?
R// Primero se busca en la lista, luego se saca de
la lista (encadenando directamente el anterior
con el siguiente)

: Curso

cabeza


Eliminar un elemento
1. Se busca el objeto a eliminar

: Curso

cabeza


Eliminar un elemento
1. Se busca el objeto a eliminar
2. Se saca de la lista (encadenando directamente el anterior
con el siguiente)

: Curso

cabeza


Eliminar un elemento
1. Se busca el objeto a eliminar
2. Se saca de la lista (encadenando directamente el anterior
con el siguiente)

Qué pasa con el objeto?

: Curso

cabeza


Eliminar un elemento
1. Se busca el objeto a eliminar
2. Se saca de la lista (encadenando directamente el anterior
con el siguiente)

Qué pasa con el objeto?


R// Como nadie lo referencia,
: Curso
se lo lleva el recolector de
cabeza basura de java


Eliminar un elemento de la lista
public void eliminarEstudiante( String nombre )
{

}
public void eliminarEstudiante( String nombre )
{
if( cabeza != null && nombre.equals( cabeza.darNombre( ) ) )
cabeza = cabeza.darSiguiente( );

else if( cabeza != null )


{
boolean encontre = false;
Estudiante estudianteTemporal = cabeza;
Estudiante estudianteSiguiente = estudianteTemporal.darSiguiente( );

while( estudianteSiguiente != null && !encontre )


{
if( nombre.equals( estudianteSiguiente.darNombre( ) ) )
{
estudianteTemporal.cambiarSiguiente( estudianteSiguiente.darSiguiente( ) );
encontre = true;
}
else
{
estudianteTemporal = estudianteSiguiente;
estudianteSiguiente = estudianteTemporal.darSiguiente( );
}
}
}
}
Insertar un elemento en una
posición dada
public void insertarEstudiante ( String nombre, double nota, int pos )
{

}
Insertar un elemento en una lista ordenada
ascendentemente por nombre
public void insertarEstudiante ( String nombre, double nota)
{

}
Eliminar el elemento de una
posición dada
public void eliminarEstudiante ( int pos )
{

}
Eliminar un elemento en una lista ordenada
ascendentemente por nombre
public void eliminarEstudiante ( String nombre )
{

}
Ordenar la lista ascendentemente por nota
con el método de selección
public void ordenarPorNota ( )
{

}
Listas doblemente
encadenadas
Caso de Estudio: La Agenda
Modelo del mundo con una lista
doblemente encadenada

Encadenamiento
doble

Encadenamiento
sencillo
Representación gráfica
Operaciones sobre listas
doblemente encadenadas
• Recorrido
• Ej.: Contar el número de días de una agenda

• Búsqueda
• Ej.: Buscar el día dada la fecha

• Inserción (al inicio / al final / en una posición dada


de la lista)
• Crear un nuevo Dia en la agenda con una fecha dada

• Eliminación
• Eliminar un Día de la agenda
Hoja de trabajo sobre la
agenda
Nuevos componentes de
interfaz: JComboBox,
JRadioButton, JTextArea,
JComboBox

http://java.sun.com/docs/books/tutorial/uiswing/components/combobox.html
Combo Box
– Permite al usuario seleccionar uno de varios
valores.
– Tiene dos formas: no editable y editable.

Combo box
editable
Combo box
no editable
(por defecto)
Pros y Contras del combo box
– Ocupa un espacio pequeño en la interfaz
(menos que las listas o los radio buttons). Son
entonces mas apropiados cuando el espacio
es limitado y hay varias posibilidades de
escogencia.
– Las listas son mas apropiadas que los combo
box cuando hay demasiados items (mas de
20) o cuando el usuario tiene la posibilidad de
seleccionar múltiples items.
Combo Box – Creación
dentro de un panel
private JComboBox cbbCitas; Declaración como atributo
privado del panel

cbbCitas = new JComboBox( ); Creación del objeto en el


método constructor del
panel o un método
“inicializador” llamado por
el constructor

Habilitación / Deshabilitación
cbbCitas.setEnabled( true );
(opcional)

add( cbbCitas ); Adición al panel


Combo Box – Otros métodos
Adiciona un objeto al combo box ( se
addItem( objeto ); muestra según el resultado de
cbbCitas.addItem( new Integer( 9 ) ); toString del objeto)

getSelectedItem( ); Devuelve el ítem (objeto) seleccionado


int numCitas = ( ( Integer )cbbCitas.getSelectedItem( ) ).intValue( );

getSelectedIndex( ); Devuelve el índice (posición) del


objeto seleccionado
int pos = cbbCitas.getSelectedIndex( );

setSelectedIndex( indice ); Selecciona un elemento del combo


box
cbbCitas.getSelectedIndex( 0 );
JRadioButton

http://java.sun.com/docs/books/tutorial/uiswing/components/button.html#radiobutton
Radio Button
– Radio buttons son grupos de botones en los
cuales, por convención, sólo un botón puede
ser seleccionado al mismo tiempo.
– Otras formas de desplegar al usuario
escogencias (selecciones posibles) son los
combo box y las listas.
Radio Button – Creación dentro de un panel
private JRadioButton radio1; Declaración como atributo
privado del panel

Creación del objeto en el


radio1 = new JRadioButton( “1" ); método constructor del
panel o un método
“inicializador” llamado por
el constructor

Habilitación / Deshabilitación
radio1.setEnabled( false ); (opcional)

private ButtonGroup grupoPrioridad; Adición al panel mediante un


grupoPrioridad = new ButtonGroup( ); grupo de botones

grupoPrioridad.add( radio1 );
Radio Button – Otros
métodos
Selecciona una de las opciones del
setSelected( true / false ); grupo
radio1.setSelected( true );

isSelected( ); Dice si la opción está


seleccionada o no
if ( radio1.isSelected( ) )
{
prioridad = 1;
}
JTextArea

http://java.sun.com/docs/books/tutorial/uiswing/components/textarea.html
JTextArea
– Es una zona de múltiples líneas de texto
– Debe ser puesta dentro de un JScrollPane si
se quiere scroll
JTextArea – Creación dentro de un panel
private JTextArea txtDescripcion; Declaración como atributo privado del panel

Creación del objeto en el método


txtDescripcion = new JTextArea( 5, 20 ); constructor del panel o un método

txtDescripcion.setBorder( new LineBorder( Color.BLACK ) );


txtDescripcion.setWrapStyleWord( true );
Configuración de opciones de
txtDescripcion.setLineWrap( true ); edición
txtDescripcion.setEnabled( true );

gbc = new GridBagConstraints( 0, 5, 3, 1, 0, 1,


GridBagConstraints.CENTER, GridBagConstraints.BOTH, Adición al panel
new Insets( 5, 5, 5, 5 ), 0, 0 );
add( txtDescripcion, gbc );
JTextArea – Otros métodos
Adiciona una cadena al final del texto
append( String )

insert( String, pos) Inserta una cadena en una posición


dada dentro del texto

Configura el tipo de letra (Font es una


setFont( Font ) clase de Java)

setLineWrap( boolean )

Devuelve el texto de la caja


getText( )
JTextArea – Otros métodos
Devuelve el texto seleccionado por el
getSelectedText( ) usuario

setEditable ( boolean ) Determina si se puede editar o no

También podría gustarte