Você está na página 1de 8

Listas Enlazadas C++

Implementacin del fichero nodo.h


#ifndef NODO_H
#define NODO_H
#include <iostream>
using namespace std;
class Nodo
{
private:
int codigo;
string nombre;
float nota1;
float nota2;
float nota3;
Nodo* siguiente;
public:
Nodo();
void setCodigo(int cod);
void setNombre(string nom);
void setNota1(float n1);
void setNota2(float n2);
void setNota3(float n3);
void setSiguiente(Nodo* sig);
int getCodigo();
string getNombre();
float getNota1();
float getNota2();
float getNota3();
Nodo* getSiguiente();
float definitiva();
virtual ~Nodo();
};
#endif // NODO_H

Implementacin del fichero nodo.cpp


#include "nodo.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
Nodo::Nodo()
{
codigo = 0;
nombre = "";
nota1 = 0;
nota2 = 0;
nota3 = 0;
siguiente = NULL;
}

void Nodo::setCodigo(int cod){


codigo = cod;
}
void Nodo::setNombre(string nom){
nombre = nom;
}
void Nodo::setNota1(float n1){
nota1 = n1;
}
void Nodo::setNota2(float n2){
nota2 = n2;
}
void Nodo::setNota3(float n3){
nota3 = n3;
}
void Nodo::setSiguiente(Nodo* sig){
siguiente = sig;
}
int Nodo::getCodigo(){
return codigo;
}
string Nodo::getNombre(){
return nombre;
}
float Nodo::getNota1(){
return nota1;
}
float Nodo::getNota2(){
return nota2;
}
float Nodo::getNota3(){
return nota3;
}
Nodo* Nodo::getSiguiente(){
return siguiente;
}
float Nodo::definitiva(){
return (nota1 + nota2 + nota3)/3;
}
Nodo::~Nodo()
{
//dtor
}

Implementacin del fichero listaenlazada.h


#ifndef LISTAENLAZADA_H
#define LISTAENLAZADA_H
#include "nodo.h"
class ListaEnlazada
{
private:
Nodo* cabeza;
public:
ListaEnlazada(); //Mtodo constructor de la clase ListaEnlazada.

void setCabeza(Nodo* cab); //Mtodo modificador para asignar un nodo en la cabeza de la lista.
Nodo* getCabeza(); //Mtodo para obtener el primer nodo de la lista.
Nodo* ultimo(); //Mtodo que devuelve el ultimo nodo de la lista.
int contarNodos(); //Mtodo para contar cuantos nodos hay en la lista.
void agregar(Nodo* nuevo); //Mtodo para agregar un nuevo nodo en la lista.
Nodo* buscar(int cod); //Mtodo que buscar un nodo dentro de la lista.
void eliminar(Nodo* nd); //Mtodo para eliminar un nodo de la lista.
float promedioGeneral(); //Mtodo que calcula el promedio de todas las notas definitivas almacenadas.
float maximaDefinitiva(); //Mtodo que devuelve la nota definitiva mas alta de las almacenadas en la lista.
void limpiar(); //Mtodo que borra todos los nodos de la lista.
virtual ~ListaEnlazada();
};

Implementacin del fichero listaenlazada.cpp


#include "listaenlazada.h"
#include <stdlib.h>
#include <iostream>
using namespace std;
ListaEnlazada::ListaEnlazada()
{
cabeza = NULL; //Inicialmente la lista esta vaca, la cabeza apunta a nulo.
}
//Implementacin del mtodo que asigna el primer nodo de la lista (nodo cabeza).
void ListaEnlazada::setCabeza(Nodo* cab){
cabeza = cab;
}
//Implementacin del mtodo para obtener el primer nodo de la lista (nodo cabeza).
Nodo* ListaEnlazada::getCabeza(){
return cabeza;
}
//Implementacin del mtodo que recorre toda la lista (si hay elementos) y devuelve el ultimo nodo.
Nodo* ListaEnlazada::ultimo(){
Nodo* temp = cabeza;
while(temp != NULL){
if(temp->getSiguiente() == NULL){ //Si temp apunta a nulo el nodo temporal (temp) es el ultimo de la lista.
break; //Se rompe el ciclo.
}else{
temp = temp->getSiguiente(); //De lo contrario se pasa al siguiente nodo de la lista.
}
}
return temp;
}
//Implementacin del mtodo que recorre la lista y cuenta cuantos nodos hay en la lista.
int ListaEnlazada::contarNodos(){
int contador = 0;
Nodo* temp = cabeza;
while(temp != NULL){
contador++;

temp = temp->getSiguiente();
}
return contador;
}
//Implementacin del mtodo que agregar un nuevo nodo en la lista.
void ListaEnlazada::agregar(Nodo* nuevo){
if(cabeza == NULL){ //La lista esta vaca
cabeza = nuevo;
}else{
ultimo()->setSiguiente(nuevo);
}
}
//Implementacin del mtodo que busca un nodo dentro de la lista, pasando como parmetro de bsqueda el
//cdigo del estudiante.
Nodo* ListaEnlazada::buscar(int cod){
Nodo* temp = cabeza;
while(temp != NULL){
if(temp->getCodigo() == cod){
break;
}else{
temp = temp->getSiguiente();
}
}
return temp;
}
//Implementacin del mtodo que elimina el nodo de la lista pasado como parmetro (nd).
void ListaEnlazada::eliminar(Nodo* nd){
Nodo* anterior;
if(nd == cabeza){ //Si el nodo a eliminar en la lista es el primero entonces.
cabeza = cabeza->getSiguiente();
}else{ //Se Busca el nodo anterior al que se quiere eliminar (nd).
anterior = cabeza;
while(anterior->getSiguiente() != nd){
anterior = anterior->getSiguiente();
}
//El siguiente de anterior es el nodo que le sigue al que se va a eliminar (nd).
anterior->setSiguiente(nd->getSiguiente());
}
nd->setSiguiente(NULL); //Se corta el enlace del nodo a borrar, haciendo que su siguiente apunte a nulo.
delete nd; //Se libera la instancia del nodo a borrar.
}
//Implementacin del mtodo que calcula el promedio de todas las notas definitivas almacenadas en la lista.
float ListaEnlazada::promedioGeneral(){
int cantidad = 0;
float suma = 0;
Nodo* temp = cabeza;
while(temp != NULL){
cantidad++;
suma = suma + temp->definitiva();
temp = temp->getSiguiente();
}
if(cantidad > 0)
return suma/cantidad;
else

return 0;
}
//Implementacin del mtodo que devuelve la nota definitiva mas alta de las almacenadas en la lista.
float ListaEnlazada::maximaDefinitiva(){
float def, max;
max = 0;
Nodo* temp = cabeza;
while(temp != NULL){
def = temp->definitiva();
if(def > max){
max = def;
}
temp = temp->getSiguiente();
}
return max;
}
//Implementacin del mtodo que borra todos los nodos de la lista.
void ListaEnlazada::limpiar(){
while(cabeza != NULL){
eliminar(cabeza);
}
}
ListaEnlazada::~ListaEnlazada()
{
limpiar();
}

Implementacin del fichero main.cpp


#include <iostream>
using namespace std;
#include "listaenlazada.h"
#include "nodo.h"
#include <stdlib.h>
//Se declaran los siguientes mtodos:
void llenar(Nodo* nod); //Mtodo para asignar los valores a los atributos de la clase Nodo.
//Mtodo para obtener y mostrar los valores asignados a los atributos de la clase Nodo.
void mostrar(Nodo* nod);
void listar(Nodo* nod); //Mtodo para listar cada uno de los nodos de la lista.
int menu(); //Mtodo para asignar un men de opciones.
int main()
{
int opc, cod;
Nodo* aux;
ListaEnlazada* lis = new ListaEnlazada();
do{
opc = menu();
switch(opc){
case 1:
system("cls");
cout << "________________________________________________ \n";

cout << "\n


AGREGAR UN NODO A LA LISTA \n";
cout << "________________________________________________ \n \n";
aux = new Nodo();
llenar(aux);
lis->agregar(aux);
break;
case 2:
system("cls");
cout << "________________________________________________ \n";
cout << "\n
BUSCAR UN NODO EN LA LISTA \n";
cout << "________________________________________________ \n \n";
cout << "DIGITE CODIGO A BUSCAR: ";
cin >> cod;
cout << "\n";
aux = lis->buscar(cod);
if(aux != NULL){
mostrar(aux);
}else{
cout << "Codigo no encontrado";
}
cout << "\n";
break;
case 3:
system("cls");
cout << "________________________________________________ \n";
cout << "\n
NUMERO DE NODO REGISTRADOS \n";
cout << "________________________________________________ \n \n";
cout << "CANTIDAD DE NODOS EN LA LISTA: " << lis->contarNodos();
cout << "\n";
break;
case 4:
system("cls");
cout << "________________________________________________ \n";
cout << "\n
PROMEDIO DE LAS NOTAS DEFINITIVAS \n";
cout << "________________________________________________ \n \n";
cout << "PROMEDIO GENERAL: " << lis->promedioGeneral();
cout << "\n";
break;
case 5:
system("cls");
cout << "________________________________________________ \n";
cout << "\n
MAXIMA NOTA DE LAS DEFINITIVAS \n";
cout << "________________________________________________ \n \n";
cout << "MAXIMA NOTA DEFINITIVA: " << lis->maximaDefinitiva();
cout << "\n";
break;
case 6:
system("cls");
cout << "________________________________________________ \n";
cout << "\n
LISTAR LOS NODOS DE LA LISTA \n";
cout << "________________________________________________ \n \n";
listar(lis->getCabeza());
break;
case 7:
system("cls");
cout << "\n";
lis->limpiar();
cout << "Lista vacia...";

cout << "\n";


break;
case 8:
break;
}
}while(opc != 8);
delete lis;
return 0;
}
//Implementacin de los mtodos declarados anteriormente:
void llenar(Nodo* nod){
int cod;
string nom;
float n1,n2,n3;
cout << "Digite CODIGO del Estudiante: ";
cin >> cod;
cout << "Digite NOMBRE del Estudiante: ";
cin >> nom;
cout << "Digite La NOTA 1: ";
cin >> n1;
cout << "Digite La NOTA 2: ";
cin >> n2;
cout << "Digite La NOTA 3: ";
cin >> n3;
nod->setCodigo(cod);
nod->setNombre(nom);
nod->setNota1(n1);
nod->setNota2(n2);
nod->setNota3(n3);
}
void mostrar(Nodo* nod){
cout << "CODIGO: " << nod->getCodigo() << "\n";
cout << "NOMBRE: " << nod->getNombre() << "\n";
cout << "NOTA 1: " << nod->getNota1() << "\n";
cout << "NOTA 2: " << nod->getNota2() << "\n";
cout << "NOTA 3: " << nod->getNota3() << "\n";
cout << "DEFINITIVA: " << nod->definitiva() << "\n";
cout << "\n";
}
void listar(Nodo* nod){
Nodo* temp = nod;
while(temp != NULL){
mostrar(temp);
temp = temp->getSiguiente();
}
}
int menu(){
int opcion = 0;
cout << "________________________________________________ \n";
cout << "\n
ESCOJA UNA OPCION DEL MENU \n";
cout << "________________________________________________ \n \n";
cout << "\n1. Agregar Nodo\n";
cout << "2. Buscar Nodo\n";

cout << "3. Cantidad de Nodos en la Lista\n";


cout << "4. Promedio General\n";
cout << "5. Maxima Nota Promedio\n";
cout << "6. Listar Nodos\n";
cout << "7. Limpiar Lista\n";
cout << "8. Salir\n";
cout << "________________________________________________ \n";
do{
cout << "\nSeleccione una opcion del 1 al 8: ";
cin >> opcion;
}while(opcion <= 0 || opcion > 8);
return opcion;
}

Você também pode gostar