domingo, enero 25, 2009

Apuntadores en C o C++ -Ejemplo-

Debido a una peticion de poner un ejemplo acerca de el uso de apuntadores ver post Apuntadores en C o C++ -Conceptos-, expondré un ejemplo práctico del uso de apuntadores.

Este ejemplo trataré de que sea sencillo, simplemente es una lista donde se almacenan números,
se dan de alta y se pueden dar de baja y se pueden listar. Eso es todo lo que haría el programita.

Primero mostraré el ejemplo ejecutándose, y al finalizar mostraré el código fuente.
Como es por demas evidente, la importancia de esto no es el "qué", sino el "cómo", en otras palabras, no se usará ningun programa visual, ni UI ni mucho menos.


Este seria la pantalla principal












Al seleccionar la opcion 1, podemos insertar el numero, digamos el 100
El programa lo inserta en la lista, y si hay más de uno lo insertará al final.
Insertemos algunos numeros...







Los listamos














Digamos que ahora queremos borrar el dato
"102" que ocupa la posicion 3 de la lista.
(no me salgas que es la posicion 2 OK?)










Los volvemos a listar:









Ahora el codigo fuente:

void Menu();

void Insertar();

void Eliminar();

int MostrarDatos();

void Salir();



typedef struct Lista

    {

       int dato;

       struct Lista *siguiente;

     } tipoNodo;

     

Lista *Inicio;  //Apuntador al inicio de la lista

tipoNodo *pNodo;

typedef tipoNodo *List;



int main(int argc, char* argv[])

{

    Menu();

    getch();

    return 0;

}



//--- Funciones --------------

void Menu(){

int opc;

clrscr();

cout<<"1.- Insertar elemento en la lista"<<endl;

cout<<"2.- Eliminar Elemento de la lista"<<endl;

cout<<"3.- Mostrar datos de la lista"<<endl;

cout<<"4.- Salir"<<endl;

cin>>opc;



   switch(opc){

      case 1:

          Insertar();

          getch();

          Menu();

          break;

       case 2:

          Eliminar();

          MostrarDatos();

          getch();

          Menu();

          break;

       case 3:

          MostrarDatos();

          getch();

          Menu();

          break;

      case 4:

          Salir();

          break;



      default:

       cout<<"Esa opcion no existe, elige una de las disponibles"<<endl;

       getch();

       Menu();

       break;

 }

}



void Insertar(){

    tipoNodo *ante, *ptr;

    /// ante    apuntador que apunta al registro anterior

    // ptr apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    Lista *tmpNodo= new(tipoNodo);

    // tmpNodo  apuntador temporal,  es el nuevo registro que se va a insertar.

    if(!tmpNodo)  //verifica si pudo obtener memoria

    {

    cout<<"Memoria Agotada";

    return;

    }

     cout<<"Ingresa el numero"<<endl;

     cin>>tmpNodo->dato;

     cout<< "Dato Ingresado: ";

     cout<< tmpNodo->dato;



    if (!pNodo)

    { /*si esta vacia la lista, lo pone al inicio*/

        tmpNodo->siguiente=NULL;

        pNodo=tmpNodo;

        return;

    }

    ante=NULL;  //apuntador que apunta al registro anterior

    ptr=pNodo;   //apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    while (ptr)

    {

        ante=ptr;

        ptr=ptr->siguiente;

    }

    /* inserto al final  */

     ante->siguiente=tmpNodo;

     tmpNodo->siguiente=NULL;

     return;

}

void Eliminar(){

    int DatoAEliminar, contador, numelementos;

    tipoNodo *ante, *ptr;

    contador=0;

    ante=NULL;  //apuntador que apunta al registro anterior

    ptr=pNodo;   //apuntador que se va a ir moviendo.... pNodo siempre apunta al principio

    numelementos=MostrarDatos(); //Muestra los datos como referencia al usuario.

    cout<< "\n\r  Dame el # del dato a eliminar: ";

    cin>> DatoAEliminar;

    if (DatoAEliminar>numelementos){

    cout<< "Elemento no existe, seleccione uno de la lista";

    return;

    }



    while (ptr)

    {

        ++contador;

        if (contador == DatoAEliminar){ // lo encontro, entonces lo borra



            if (pNodo->siguiente == NULL) {  //Es el primer elemento y el unico

                pNodo=NULL;

                return;

            }

            if (pNodo->siguiente == ptr->siguiente){ //es el primero, pero hay otros enlazados

                pNodo=ptr->siguiente;

                return;

            }

            if (ptr->siguiente != NULL){ // es alguien de enmedio a borrar

                ante->siguiente=ptr->siguiente;

                ptr=NULL;

                return;

            } else {     //es el ultimo

                ante->siguiente=NULL;

                ptr=NULL;

                return;

            }

        }

        //se va al siguiente

        ante=ptr;

        ptr=ptr->siguiente;

    }

    return;

}



int MostrarDatos(){

    tipoNodo *ptr, *ante;

    int contador;

    contador=0;



    ptr=pNodo;

    clrscr();

    cout<< "- Listado - \n\r";

    cout<< "\n\r";

    cout<< " # : Dato \n\r";

    cout<< "---  ----- \n\r";

    while(ptr)

    {

        ante=ptr;

        cout<< ++contador;

        cout<< "  : ";

        cout<<ante->dato;

        cout <<"\n\r";

        ptr=ptr->siguiente;

    }

    return contador;

}

void Salir(){

    cout<<"Pulsa una tecla para salir"<<endl;

}

11 comentarios:

  1. que tal amigo, la informacion que nos diste de lo apuntadores, estuvo de lujo, pero un pregunta el progama no jala, no se si puedas ver que onda gracias

    ResponderBorrar
  2. Tal vez te falto incluir como header:

    #pragma hdrstop
    #include < conio.h >
    #include < iostream.h >
    #pragma argsused


    la version del TC que usé :
    Turbo C++ 3.0 de Borland.

    ResponderBorrar
  3. hola quiciera saber si tienes algun codigo en el que el usuario digite la cantidad de listas y la informacion que tiene estas, ademas que apunten entre ellas, y que se pueda hacer entrelazadas
    gracias

    ResponderBorrar
  4. muy buena la informacion ingeniero miguel pero el programa no corre. buenos concejos gracias

    ResponderBorrar
  5. Hola Buen Dia, Me podria ayudar en un programa de arboles que ingrese vuelos y haga metodos de busqueda de profundidad, amplitud y A* ando un poco oxidado en C++

    ResponderBorrar
  6. Hola Buen dia Me podrian ayudar con un programa de nodos que maneje vuelos a ciudades,y metodos de busqueda amplitud, profundidad y A* estoy un poco oxidado en C++

    ResponderBorrar
  7. librerias utilizadas
    #include
    #include
    #include

    muy buen programa, solo que con C++ getch no funciona, deberia agregarle getchar, y el clrscr tampoco y hay que desactivarlo, buen aporte hermano

    ResponderBorrar
  8. no lo entiendo muy bien este tema de apuntadores,no se si podrian colgar mas ejemplos, asi como suma resta y otros gracias....

    ResponderBorrar
  9. jajajaj que claros son hee apuntador que apunta jajajaja pero buena la inf he..........

    ResponderBorrar
  10. si corre el programa gracias solo falta incluir bibliotecas...

    ResponderBorrar

Y USTED QUE OPINA?