Sei sulla pagina 1di 27

UNIVERSIDAD DE CÓRDOBA.

PROGRAMA INGENIERÍA DE SISTEMAS

Listas enlazadas dobles

Realizado por

Javier David Sánchez Calderón

Nicolas Andres Aleman Mestra

Asignatura: Programación II

Licenciado: Pedro Guevara

Universidad de Córdoba

Ingeniería de sistemas

Montería - Córdoba 2017


 Diseño de clase de la solucion.
 Implementación de la clase Nodo en el fichero Nodo.java:
public class Nodo {

private int id;

private String nombre;

private String sexo;

private byte grado;

private byte edad;

private Nodo siguiente; //Se declara un apuntador hacia delante del nodo.

private Nodo anterior; //y otro apuntador hacia atrás del nodo.

public Nodo() {

id = 0;

nombre = "";

sexo = "";

grado = 0;

edad = 0;

siguiente = null;

anterior = null;

public int getId() {

return id;

public void setId(int ide) {

id = ide;

public String getNombre() {


return nombre;

public void setNombre(String nom) {

nombre = nom;

public String getSexo() {

return sexo;

public void setSexo(String sex) {

sexo = sex;

public byte getGrado() {

return grado;

public void setGrado(byte grad) {

grado = grad;

public byte getEdad() {

return edad;

public void setEdad(byte edad) {

this.edad = edad;
public Nodo getSiguiente() {

return siguiente;

public void setSiguiente(Nodo sig) {

siguiente = sig;

public Nodo getAnterior() {

return anterior;

public void setAnterior(Nodo ante) {

anterior = ante;

 Implementación de la clase TallerColegio2 en el fichero


Tallercolegio2.java:
public class TallerColegio2 {

private Nodo cabeza; //Se declara el atributo de la clase, cabeza primer nodo de la lista.

//Método constructor de la clase TallerColegio2

public TallerColegio2() {

cabeza = null;

//Implementación del método para obtener el primer nodo de la lista (nodo cabeza).

public Nodo getCabeza() {

return cabeza;
//Implementación del método que asigna el primer nodo de la lista (nodo cabeza).

public void setCabeza(Nodo cab) {

cabeza = cab;

//Método que recorre la lista y devuelve el último nodo de la lista

public Nodo ultimo(){

Nodo temp = cabeza;

while (temp != null){

if(temp.getSiguiente()==null){

break;

}else{

temp= temp.getSiguiente();

return temp;

//Este método devuelve el nodo que se encuentra antes (anterior) de un nodo pasado como
//parámetro. En este caso devuelve el nodo que esta antes del nodo a eliminar.

public Nodo anterior(Nodo nd){

Nodo temp = cabeza;

while(temp != null){

if(temp.getSiguiente()==nd){

break;

}else{

temp=temp.getSiguiente();

return temp;
//Método para agregar un nuevo nodo en la lista, por el final.

public void agregarPorElFinal(Nodo nuevo){

Nodo temp = ultimo();

if(temp != null){

temp.setSiguiente(nuevo);

nuevo.setAnterior(temp);

nuevo.setSiguiente(null);

}else{

nuevo.setAnterior(null);

cabeza = nuevo;

//Método para agregar nodos entre dos nodos ya existentes en la lista enlazada doble.

public void agregarEntreNodos(Nodo nd, Nodo nuevo){

nuevo.setSiguiente(nd.getSiguiente());

if(nd.getSiguiente() != null){

nd.getSiguiente().setAnterior(nuevo);

nd.setSiguiente(nuevo);

nuevo.setAnterior(nd);

//Método para agregar nodos por la cabeza de la lista enlazada doble.

public void agregarCabeza(Nodo nuevo){

if(cabeza==null){

cabeza = nuevo;

}else{ nuevo.setAnterior(null);

nuevo.setSiguiente(cabeza);
cabeza.setAnterior(nuevo);

cabeza = nuevo;
}

//Busca un nodo en la lista enlazada doble desde la cabeza (inicio) hasta el último nodo de la lista, //se
pasa como parámetro de búsqueda la identificación del estudiante.

public Nodo buscarPorId(int id){

Nodo temp = cabeza;

while(temp != null){

if(temp.getId()==id){

break;

}else{

temp=temp.getSiguiente();

return temp;

//Busca un nodo en la lista enlazada doble desde el final hasta el inicio del nodo de la lista,

//se pasa como parámetro de búsqueda el nombre del estudiante.

public Nodo buscarPorNombre(String nombre){

Nodo temp = ultimo();

while(temp != null){

if(temp.getNombre().equals(nombre)){

break;

}else{

temp=temp.getAnterior();

return temp;
}

//Método que eliminar un nodo de la lista enlazada doble.

public void eliminar(Nodo nd){

Nodo ante;

if(nd==cabeza){ //En caso de que el nodo a eliminar sea el primer nodo de la lista doble

cabeza=cabeza.getSiguiente();

if (cabeza != null){

cabeza.setAnterior(null);

}else{ //De lo contrario, se busca el nodo anterior al que se quiere eliminar (nd)

ante=anterior(nd);

ante.setSiguiente(nd.getSiguiente());

if(nd.getSiguiente() != null){

nd.getSiguiente().setAnterior(ante);

} nd.setAnterior(null);

nd.setSiguiente(null);

//Método que muestra los estudiantes de mayor edad de la lista enlazada doble.

public String mayorEdad(){

String mostrar ="";

int cont=0;

byte mayor =0;

byte edad;

Nodo temp = cabeza;

while(temp != null){

if(temp.getGrado()== 1 || temp.getGrado()== 5){

edad=temp.getEdad();
if(edad>mayor ){

mayor=edad;

if (edad == temp.getEdad()){

mostrar+="Nombre: "+temp.getNombre()+" "+"Sexo: "+temp.getSexo()+" "+"Edad:


"+temp.getEdad()+" Grado: "+temp.getGrado()+"°\n";
}

temp=temp.getSiguiente();

return mostrar;

//Método que cuenta la cantidad de mujeres en el grado 5 de la lista enlazada doble.

public int contarMujeres5(){

Nodo temp = cabeza;

int contar = 0;

while(temp != null){

if((temp.getSexo().equalsIgnoreCase("F") && temp.getGrado()==5)){

contar++;

temp=temp.getSiguiente();

return contar;

//Método que saca el promedio de edad de la lista enlazada doble.

public float promedioEdad(){

int cantidad = 0;

float suma = 0;
Nodo temp = cabeza;

while(temp != null){

if(temp.getSexo().equalsIgnoreCase("F") && temp.getGrado()==5){

cantidad++;

suma=suma+temp.getEdad();

temp=temp.getSiguiente();

if(cantidad >0){

return suma/cantidad;

}else{

return 0;

}
}

//Método que cuenta los estudiantes hombres de grado 1 de la lista enlazada doble.

public int contarHombreGrado1(){

Nodo temp = cabeza;

int contar = 0;

while(temp != null){

if(temp.getSexo().equalsIgnoreCase("M") && temp.getGrado()==1){

contar++;

temp=temp.getSiguiente();

return contar;

}
//Método que cuenta las estudiantes mujeres de grado 1 de la lista enlazada doble.

public int contarMujeresGrado1(){

Nodo temp = ultimo();

int contar = 0;

while(temp != null){

if(temp.getSexo().equalsIgnoreCase("F") && temp.getGrado()==1){

contar++;

temp=temp.getAnterior();

return contar;

 Implementación de la clase MainTallerColegio2 en el fichero


MainTallerColegio2.java:
public class MainTallerColegio2 {

//Se declaran los siguientes métodos, que serán llamados dentro del método static void main:
//Método para asignar los valores a los atributos de la clase Nodo.

public static void llenar(Nodo nod){

int id;

String nombre,sexo;

byte grado,edad;

id = Integer.parseInt(JOptionPane.showInputDialog("Digite la identificacion del estudiante"));

nod.setId(id);

nombre = JOptionPane.showInputDialog("Digite el nombre del estudiante");

nod.setNombre(nombre);

sexo = JOptionPane.showInputDialog("Digite el sexo del estudiante, ''M'' si es masculino o ''F'' si es


femenino");
nod.setSexo(sexo);
grado = Byte.parseByte(JOptionPane.showInputDialog("Digite el grado del estudiante de 1° hasta
5°"));

nod.setGrado(grado);

edad = Byte.parseByte(JOptionPane.showInputDialog("Digite la edad del estudiante ''debe ser


mayor de 6 años''"));

nod.setEdad(edad);

//Método para obtener y mostrar los valores asignados a los atributos de la clase Nodo.

public static void mostrar(Nodo nod){

String datosNodo="";

datosNodo= datosNodo+String.valueOf("IDENTIFICACIÓN: "+nod.getId()+"\n"+"NOMBRE:


"+nod.getNombre()+"\n"+"SEXO: "+nod.getSexo()+"\n"+"GRADO: "+nod.getGrado()+"\n"+"EDAD:
"+nod.getEdad()+"\n\n");

JOptionPane.showMessageDialog(null,"INFORMACION DE LOS ESTUDIANTES EN LA


LISTA"+"\n"+datosNodo);
}

//Método para obtener y mostrar los valores asignados a los atributos identificación y nombre de la
clase Nodo.

public static void mostrarGrados(Nodo nod){

String datosNodo="";

datosNodo= datosNodo+String.valueOf("IDENTIFICACIÓN: "+nod.getId()+"\n"+"NOMBRE:


"+nod.getNombre()+"\n\n");

JOptionPane.showMessageDialog(null,"INFORMACION DE LOS ESTUDIANTES EN LA


LISTA"+"\n"+datosNodo);

//Método para obtener y mostrar los valores asignados a los atributos nombre de la clase Nodo.

public static void mostrarMujeresGrado5(Nodo nod){

String datosNodo="";
datosNodo= datosNodo+String.valueOf("NOMBRE: "+nod.getNombre()+"\n\n");
JOptionPane.showMessageDialog(null,"MUJERES QUE CURSAN QUINTO DE
PRIMARIA"+"\n"+datosNodo);

}
//Método para listar los estudiantes de grado 2 de la lista y visualizarlos en pantalla.

public static void listarG2(Nodo nod){

Nodo temp=nod;

while(temp!=null){

if(temp.getGrado() == 2){

mostrarGrados(temp);

else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

temp=temp.getSiguiente();

//Método para listar los estudiantes de grado 3 de la lista y visualizarlos en pantalla.

public static void listarG3(Nodo nod){

TallerColegio2 lista = new TallerColegio2();

Nodo temp=nod;

while(temp!=null){

if(temp.getGrado() == 3){

mostrarGrados(temp);

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

temp=temp.getSiguiente();

}
//Método para listar los estudiantes de grado 4 de la lista y visualizarlos en pantalla.

public static void listarG4(Nodo nod){

Nodo temp=nod;

while(temp!=null){

if(temp.getGrado() == 4){

mostrarGrados(temp);

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

temp=temp.getSiguiente();

// Método que se puede utilizar para listar la información del grado 1 desde el final de la lista enlazada
doble.
public static void listarDesdeElFinalG1(Nodo nod){

Nodo temp = nod;

while(temp != null){

if(temp.getGrado() == 1){

mostrarGrados(temp);

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

temp=temp.getAnterior();

// Método que se puede utilizar para listar la información del grado 1 desde el final de la lista enlazada
doble.
public static void listarDesdeElFinalG5(Nodo nod){

Nodo temp = nod;


while(temp != null){

if(temp.getGrado() == 5){

mostrarGrados(temp);

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

temp=temp.getAnterior();

//Método para listar las estudiantes de grado 5 de la lista y visualizarlos en pantalla.

public static void listarMujeresGrado5(Nodo nod){

Nodo temp=nod;

while(temp!=null){

if((temp.getSexo().equalsIgnoreCase("F") && temp.getGrado()==5)){

mostrarMujeresGrado5(temp);

temp=temp.getSiguiente();

//Método para visualizar el menú de opciones y asignar la opción seleccionada.

public static int menu(){

int opcion = 0;

do{

opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== MENÚ PRINCIPAL


=========== \n"+ "1. Agregar, buscar o eliminar estudiante. \n"+"2. Generar reportes de estudiantes.
\n"+"3. Salir." +"\n \n Seleccione una opción del 1 al 3:"));

}while(opcion <= 0 || opcion > 3);

return opcion;

}
//Método para visualizar el submenú de opciones y asignar la opción seleccionada.

public static int subMenu1(){

int opcion = 0;

do{

opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== AGREGAR,BUSCAR O


ELIMINAR =========== \n"+ "1. Agregar informacion de estudiante por el final de la lista. \n"+"2.
Agregar informacion de estudiante entre dos estudiantes. \n"+ "3. Agregar informacion de estudiante
por el principio de la lista. \n"+"4. Buscar la informacion de un estudiante por identificacion. \n"+ "5.
Buscar informacion de un estudiante por nombre. \n"+"6. Eliminar información de los estudiantes que
terminaron grado 5°. \n"+"7. Regresar al menú principal."+"\n \n Seleccione una opción del 1 al 7:"));

}while(opcion <= 0 || opcion > 7);

return opcion;

//Método para visualizar el submenú de opciones y asignar la opción seleccionada.

public static int subMenu2(){

int opcion = 0;

do{

opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== GENERAR REPORTES


=========== \n"+ "1. Listar nombre y sexo de los estudiantes de mayor edad en los grados 1° y 5°.
\n"+"2. Listar nombres de las estudiantes de grado 5°, cantidad y edad promedio. \n"+ "3. Cantidad de
mujeres y hombres que ingresan al primer grado. \n"+"4. Listar informacion por grado. \n"+ "5. Regresar
al menú principal. \n"+"\n \n Seleccione una opción del 1 al 5:"));
}while(opcion <= 0 || opcion > 5);

return opcion;

//Método para visualizar el submenú de opciones y asignar la opción seleccionada.

public static int subMenu3(){

int opcion = 0;

do{

opcion = Integer.parseInt(JOptionPane.showInputDialog("=========== LISTAR ALUMNOS POR


GRADOS =========== \n"+ "1. Grado 1°. \n"+"2. Grado 2°. \n"+ "3. Grado 3°. \n"+"4. Grado 4°. \n"+ "5.
Grado 5°. \n"+"6. regresar al menú 'generar reportes'."+"\n \n Seleccione una opción del 1 al 6:"));
}while(opcion <= 0 || opcion > 6);
return opcion;

public static void main(String[] args) {

//Se crea el objeto lis de la clase TallerColegio2.

TallerColegio2 lis = new TallerColegio2 ();

int opcion,cod;

String nom;

Nodo aux;

do{

opcion = menu();

switch(opcion){

case 1:

do{

opcion = subMenu1();

switch(opcion){

case 1:

aux = new Nodo();//Cuando se agrega un nodo se crea un nuevo objeto de la clase nodo.

llenar(aux);

if(aux.getEdad()>5){

if(aux.getGrado()<6){

if((aux.getSexo().equalsIgnoreCase("f")) || (aux.getSexo().equalsIgnoreCase("m"))){

cod = aux.getId();

if(lis.buscarPorId(cod) != null){

JOptionPane.showMessageDialog(null,"Este estudiante ya se encuentra registrado");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{

JOptionPane.showMessageDialog(null,"Informacion registrada exitosamente");

lis.agregarPorElFinal(aux);

}
}else{

JOptionPane.showMessageDialog(null,"El sexo del estudiante debe ser M o F");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{
JOptionPane.showMessageDialog(null,"El grado del estudiante debe estar entre 1° y
5°");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");


}

}else{

JOptionPane.showMessageDialog(null,"Este estudiante no puede ser matriculado debido a su edad");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

break;

case 2:

cod = Integer.parseInt(JOptionPane.showInputDialog("Digite la identificación del


Estudiante Despues del que Quiere Agregar el Nuevo estudiante: "));

Nodo nd = lis.buscarPorId(cod);

if(nd!=null){

aux = new Nodo();

llenar(aux);

if(aux.getEdad()>5){

if(aux.getGrado()<6){

if((aux.getSexo().equalsIgnoreCase("f")) ||
(aux.getSexo().equalsIgnoreCase("m"))){

cod = aux.getId();

if(lis.buscarPorId(cod) != null){

JOptionPane.showMessageDialog(null,"Este estudiante ya se encuentra registrado");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{
JOptionPane.showMessageDialog(null,"Informacion registrada exitosamente");

lis.agregarEntreNodos(nd, aux);

}else{
JOptionPane.showMessageDialog(null,"El sexo del estudiante debe ser M o
F");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");


}

}else{

JOptionPane.showMessageDialog(null,"El grado del estudiante debe estar entre 1° y 5°");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");


}

}else{

JOptionPane.showMessageDialog(null,"Este estudiante no puede ser matriculado debido a su edad");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{

JOptionPane.showMessageDialog(null,"La identificación que digitó no se encuentra


registrada en la base de datos");

break;

case 3:

aux = new Nodo();

llenar(aux);

if(aux.getEdad()>5){

if(aux.getGrado()<6){

if((aux.getSexo().equalsIgnoreCase("f")) || (aux.getSexo().equalsIgnoreCase("m"))){

cod = aux.getId();

if(lis.buscarPorId(cod) != null){
JOptionPane.showMessageDialog(null,"Este estudiante ya se encuentra registrado");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{

JOptionPane.showMessageDialog(null,"Informacion registrada exitosamente");

lis.agregarCabeza(aux);

}else{

JOptionPane.showMessageDialog(null,"El sexo del estudiante debe ser M o F");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{

JOptionPane.showMessageDialog(null,"El grado del estudiante debe estar entre 1° y 5°");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

}else{

JOptionPane.showMessageDialog(null,"Este estudiante no puede ser matriculado debido a su edad");

JOptionPane.showMessageDialog(null,"La informacion no fue registrada");

break;

case 4:

cod = Integer.parseInt(JOptionPane.showInputDialog("Digite la identificacion del estudiante a buscar:"));

aux= lis.buscarPorId(cod);

if(aux != null){

mostrar(aux);

}else{

JOptionPane.showMessageDialog(null,"La identificación que busca NO se encuentra en la


base de datos");

break;
case 5:

nom = JOptionPane.showInputDialog("Digite el nombre del estudiante a buscar:");

aux= lis.buscarPorNombre(nom);

if(aux != null){

mostrar(aux);

}else{

JOptionPane.showMessageDialog(null,"El nombre que busca NO se encuentra en la base de datos");

break;

case 6:

cod = Integer.parseInt(JOptionPane.showInputDialog("Digite el CODIGO del estudiante a eliminar:"));

aux = lis.buscarPorId(cod);

if(aux != null){

if(aux.getGrado() < 5){

JOptionPane.showMessageDialog(null,"Este estudiante aun no cursa grado 5°");

}else{

lis.eliminar(aux);

JOptionPane.showMessageDialog(null, "La información fué borrada correctamente");

}else{

JOptionPane.showMessageDialog(null,"La identificación que busca no se encuentra


en la base de datos");

break;

case 7:

break;

while (opcion != 7);


break;

case 2:
do{

opcion = subMenu2();

switch(opcion){

case 1:

if(lis.getCabeza() != null){

JOptionPane.showMessageDialog(null,"Los estudiantes con maxima edad son: \n"+lis.mayorEdad());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes registrados");

break;

case 2:

if(lis.getCabeza() != null){

listarMujeresGrado5(lis.getCabeza());

JOptionPane.showMessageDialog(null,"Cantidad De Mujeres: "+lis.contarMujeres5()+"


Promedio De Las Edades Es: "+lis.promedioEdad());

}else{

JOptionPane.showMessageDialog(null,"No hay mujeres registradas en grado 5°");

break;

case 3:

JOptionPane.showMessageDialog(null,"========= TOTAL DE HOMBRES Y MUJERES EN


PRIMER GRADO ========= \n\n"+"Total Hombres: "+lis.contarHombreGrado1()+"\nTotal mujeres:
"+lis.contarMujeresGrado1()+"\nTotal general:
"+(lis.contarHombreGrado1()+lis.contarMujeresGrado1()));
break;

case 4:

do{

opcion = subMenu3();
switch(opcion){

case 1:

if(lis.ultimo() != null){

listarDesdeElFinalG1(lis.ultimo());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

break;

case 2:

if(lis.getCabeza() != null){

listarG2(lis.getCabeza());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

break;

case 3:

if(lis.getCabeza() != null){

listarG3(lis.getCabeza());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

break;

case 4:

if(lis.getCabeza() != null){

listarG4(lis.getCabeza());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

break;
case 5:

if(lis.ultimo() != null){

listarDesdeElFinalG5(lis.ultimo());

}else{

JOptionPane.showMessageDialog(null,"No hay estudiantes en la lista");

break;

case 6:

break;
}
}

while (opcion != 6);

}
}

while(opcion != 5);

break;

case 3:

break;
}
}

while(opcion != 3);
}

}
Menú de opción principal de la aplicación en ejecución:

Submenú de opción 1 de la aplicación en ejecución:

Submenú de opción 2 de la aplicación en ejecución:


Submenú de opción 4 de opción 2 de la aplicación en ejecución:

Potrebbero piacerti anche