Listas enlazadas C++, struct a clases

Iniciado por DEaniz, 5 Mayo 2015, 22:37 PM

0 Miembros y 1 Visitante están viendo este tema.

DEaniz

Hola, buenas tardes, quisiera saber si alguien me podría ayudar,
hice un programa de listas enlazadas, pero use struct, ya que se me hacia mas facil crear un programa así, pero mi maestra me dijo que no tenia que ser con struct, sino con CLASES, y no se como hacer mi mismo programa pero con clases,
alguien que me pueda orientar o ayudar porfavor?
MUCHAS GRACIAS

_________________________________________________
Este es mi programa


Código (cpp) [Seleccionar]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<conio.h>
#include <iostream>
using namespace std;

typedef struct dato nodo;

nodo* crear_lista(nodo* lista);
nodo* ingresar_dato(char* nombre, int boleta, nodo* lista);

void mostrar_lista(nodo* lista);
void mostrar_nodo(nodo* elemento);
void menu(void);

void borrar_lista(nodo* lista);
nodo* borrar_nodoxnombre(char *nombre, nodo* lista);
nodo* borrar_nodoxnota(int boleta, nodo* lista);

nodo* buscar_nodo(nodo* lista, char *caracter);
void ordenar_lista(nodo* lista);



struct dato
    {
    char nombre[80];
    int nota;
    struct dato *sig;
    };

nodo* crear_lista(nodo* lista)
    {
    return (lista = NULL);
    }

nodo* ingresar_dato(char* nombre, int boleta, nodo* lista)
    {
    nodo *nuevo_dato;
    nodo *auxiliar = NULL;

    nuevo_dato = (nodo*)malloc(sizeof(nodo));

    if(nuevo_dato != NULL)
        {
        strcpy((nuevo_dato->nombre), nombre);
        nuevo_dato->nota = boleta;
        nuevo_dato->sig = NULL;

        if(lista == NULL)
            lista = nuevo_dato;
        else
            {
            auxiliar = lista;
            while(auxiliar->sig != NULL)
                auxiliar = auxiliar->sig;
            auxiliar->sig = nuevo_dato;
            }
        }
    else
         cout<<"\n\nNo se pudo reservar memoria\n\n";
    return lista;
    }

void mostrar_lista(nodo* lista)
    {
    nodo *auxiliar;
    int contador = 0;

    if(lista == NULL)
        cout<<"\n\nLa lista esta vacia\n\n";

    auxiliar = lista;
    while(auxiliar != NULL)
        {
         cout<<"\n\nPersona"<<(contador+1);
         cout<<"\nNombre y Apellido: "<<auxiliar->nombre;
         cout<<"\n\nBoleta:      "<< auxiliar->nota;
        contador++;

        auxiliar = auxiliar->sig;
        }
   cout<<"\nFin de lista\n\n";
    }

void borrar_lista(nodo* lista)
    {
    nodo *borra;

    borra = lista;
    while(borra)
        {
        lista = lista->sig;
        free(borra);
        borra = lista;
        }
    }

void menu(void)
    {

     cout<<"\n\nLista_Practica_3             3CM7:\n\n";
     cout<<"1) Ingresar dato\n";
    cout<<"2) Mostrar lista\n";
   cout<<"3) Borrar lista\n";
    cout<<"4) Borrar por nombre\n";
     cout<<"5) Borrar por boleta\n";
     cout<<"6) Buscar en lista\n";
     cout<<"7) Ordenar lista\n";
    cout<<"0)SALIR\n\n";


    }

nodo* borrar_nodoxnombre(char *nombre, nodo* lista)
     {
    if(lista != NULL)
        {
        nodo *ptraux;
        nodo *ptranterior = NULL;
        int cont;

        ptraux = lista;
        while(ptraux != NULL && (strcmp(ptraux->nombre, nombre) != 0))
            {
            ptranterior = ptraux;
            ptraux = ptraux->sig;
            cont++;
            }
        if(cont == 1 && ptraux->sig == NULL)
            {
            free(ptraux);
            lista = NULL;
            }
        if(ptraux == NULL)
            cout<<"\n\nNo se encontro una persona con ese nombre\n\n";
        else if(ptranterior == NULL)
            {
            lista = lista->sig;
            free(ptraux);
            }
        else
            {
            ptranterior->sig = ptraux->sig;
            free(ptraux);
            }
        }

    return lista;
    }

nodo* borrar_nodoxnota(int boleta, nodo* lista)
        {
    if(lista != NULL)
        {
        nodo *ptraux;
        nodo *ptranterior = NULL;
        int cont = 0;

        ptraux = lista;
        while(ptraux != NULL && ptraux->nota != boleta)
            {
            ptranterior = ptraux;
            ptraux = ptraux->sig;
            cont++;
            }
        if(cont == 1 && ptraux->sig == NULL)
            {
            free(ptraux);
            lista = NULL;
            }
        if(ptraux == NULL)
            cout<<"\n\nNo se encontro una persona con ese numero de boleta\n\n";
        else if(ptranterior == NULL)
            {
            lista = lista->sig;
            free(ptraux);
            }
        else
            {
            ptranterior->sig = ptraux->sig;
            free(ptraux);
            }
        }

    return lista;
    }

nodo* buscar_nodo(nodo* lista, char *caracter)
    {
    nodo *aux;
    char noabuscar[20];
    char a[] = "a";
    char b[] = "b";
    int nabuscar;
    if(lista != NULL)
        {
        if(strcmp(caracter,a) == 0)
            {
            cout<<"\n\nIngrese el nombre a buscar: ";
            fflush(stdin);
            fgets(noabuscar, 20, stdin);
            aux = lista;
            while(aux != NULL)
                {
                if(strcmp(aux->nombre, noabuscar) == 0)
                    return aux;
                aux = aux->sig;
                }
            return aux;
            }
        else if(strcmp(caracter,b) == 0)
            {
            cout<<"\n\nIngrese la nota a buscar: ";
            fflush(stdin);
            cout<<nabuscar;
            aux = lista;
            while(aux != NULL)
                {
                if(aux->nota == nabuscar)
                    return aux;
                aux = aux->sig;
                }
            return aux;
            }
         else
            {
            cout<<"\n\nOpcion no valida\n\n";
            return 0;
            }
        }
    }

void mostrar_nodo(nodo* elemento)
    {
    nodo* nodoencontrado;
    nodoencontrado = elemento;
    if(nodoencontrado == NULL)
       cout<<"\n\nNo se obtuvieron resultados\n\n";


    else
        {
        cout<<"\n\nNodo encontrado:\n\n";
        cout<<"\nNompre y apellido:"<< nodoencontrado->nombre;
        cout<<"\nBoleta:  "<< nodoencontrado->nota;

        }
    }
/*    \n\n\n\n   */

void ordenar_lista(nodo* lista)
    {
    nodo *anterior;
    nodo *siguiente;
    nodo temp;

    anterior = lista;

    while(anterior->sig != NULL)
        {
        siguiente = anterior->sig;

        while(siguiente != NULL)
            {
            if(strcmp(anterior->nombre, siguiente->nombre) > 0)
                {
                strcpy(temp.nombre, siguiente->nombre);
                temp.nota = siguiente->nota;
                strcpy(siguiente->nombre, anterior->nombre);
                siguiente->nota = anterior->nota;
                strcpy(anterior->nombre, temp.nombre);
                anterior->nota = temp.nota;
                }
            siguiente = siguiente->sig;
            }
        anterior = anterior->sig;
        siguiente = anterior->sig;
        }
cout<<"\n\nLista ordenada\n\n";


    }

    int main(int argc, char** argv)
    {
    nodo *inicio;
    nodo *nodobuscado;
    char nom[20];
    char nomaborrar[20];
    int nborrar;
    int nota, i, cant, op;
    char s[2];

    inicio = crear_lista(inicio);

    menu();
    cin>>op;
    while(op != 0)
        {
        switch(op)
            {
            case 1: cout<<"\n\nQue cantidad de datos ingresara: ";
                    cin>>cant;
                    cout<<"\n\n";

                    cout<<"Ingreso de datos:\n\n";
                    for(i=0 ; i < cant ; i++)
                        {
                        cout<<"Nombre y apellido: ";
                        fflush(stdin);
                        fgets(nom, 80, stdin);
                       cout<<"\nBoleta:      ";
                        fflush(stdin);
                        cin>>nota;
                        cout<<"\n\n";
                        inicio = ingresar_dato(nom, nota, inicio);
                        }
                    break;

            case 2: mostrar_lista(inicio);
                    break;

            case 3: borrar_lista(inicio);
                    free(inicio);
                    cout<<"\n\nLista Borrada\n\n";
                    inicio = NULL;
                    break;

            case 4: cout<<"\n\nIngrese el nombre a borrar\n\n";
                    fflush(stdin);
                    fgets(nomaborrar, 80, stdin);
                    inicio = borrar_nodoxnombre(nomaborrar, inicio);
                    break;

            case 5: cout<<"\n\nIngrese la nota a borrar\n\n";
                    fflush(stdin);
                    cin>>nborrar;
                    inicio = borrar_nodoxnota(nborrar, inicio);
                    break;

            case 6: cout<<"\n\n('a') para buscar por nombre || ('b') para buscar por nota\n\n";
                    fflush(stdin);
                    fgets(s, 2, stdin);
                    nodobuscado = buscar_nodo(inicio, s);
                    mostrar_nodo(nodobuscado);
                    break;

            case 7: ordenar_lista(inicio);
                    break;



            default: cout<<"\n\n Este no es una opcion, intentelo nuevamente// \n\n";
            }
             getch();
            system("cls");
        menu();
        cin>>op;
        }


    return (EXIT_SUCCESS);
    }

Error 404:

#1
Muy buenas, si no me equivoco a efectos prácticos una estructura hace prácticamente cualquier cosa que haga una clase, hay muy muy poquitas diferencias, por ejemplo, en struct por defecto lo que definas es "public", en las clases por defecto es"private".
A lo que voy, para pasarlo a clase apenas si tendrás que cambiar código.
Únicamente define las variables principales como "private"; y las funciones defínelas como métodos de la clase, en la sección "public".
Con eso ya haría lo mismo que ahora, aunque como buena práctica te recomendaría que añadieses los "getters" y "setters" oportunos.

Ejemplo:
Código (cpp) [Seleccionar]


class dato
{
    private:
           char nombre[80];
           int nota;
           dato *sig;
    public:
          nodo* crear_lista(nodo* lista)
          {
                  return (lista = NULL);
           }
     //..... y todos los métodos
};



Espero haberte ayudado, corregidme si he errado en algo por favor.
Si se puede imaginar, se puede programar.

Error 404:

Cita de: Error 404: en  6 Mayo 2015, 14:10 PM
Muy buenas, si no me equivoco a efectos prácticos una estructura hace prácticamente cualquier cosa que haga una clase, hay muy muy poquitas diferencias, por ejemplo, en struct por defecto lo que definas es "public", en las clases por defecto es"private".
A lo que voy, para pasarlo a clase apenas si tendrás que cambiar código.
Únicamente define las variables principales como "private"; y las funciones defínelas como métodos de la clase, en la sección "public".
Con eso ya haría lo mismo que ahora, aunque como buena práctica te recomendaría que añadieses los "getters" y "setters" oportunos.

Ejemplo:
Código (cpp) [Seleccionar]


class dato
{
    private:
           char nombre[80];
           int nota;
           dato *sig;
    public:
          nodo* crear_lista(nodo* lista)
          {
                  return (lista = NULL);
           }
     //..... y todos los métodos
};



Eso en caso de que solo se te permita usar clases, si tu profesora te dejara usar un "struct" y clases además a mi personalmente me gusta este método:



struct dato
{
           char nombre[80];
           int nota;
           dato *sig;
}

class NombreClase
{
    private:
           dato *ptr;
    public:
          nodo* crear_lista(nodo* lista)
          {
                  return (lista = NULL);
           }
     //..... y todos los métodos
};



Espero haberte ayudado, corregidme si he errado en algo por favor.

Si se puede imaginar, se puede programar.