Related Posts Plugin for WordPress, Blogger...

Apuntadores en C o C++ -Ejemplo-

>> domingo, enero 25, 2009

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:

gomera marzo 30, 2009 11:59 a.m.  

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

Miguel abril 04, 2009 8:55 a.m.  

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.

Anónimo,  mayo 30, 2009 6:02 p.m.  

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

Anónimo,  abril 08, 2010 8:41 a.m.  

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

Oscar Enrique octubre 17, 2010 5:00 p.m.  

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++

Oscar Enrique octubre 17, 2010 5:02 p.m.  

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++

Anónimo,  noviembre 17, 2011 10:46 a.m.  

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

Anónimo,  octubre 04, 2012 12:58 p.m.  

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

Anónimo,  noviembre 14, 2012 11:25 a.m.  

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

Anónimo,  febrero 21, 2014 2:03 p.m.  

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

Publicar un comentario

Y TU QUE OPINAS?

Visitas última semana

Live Traffic Map

Locations of visitors

  © Blogger template Webnolia by Ourblogtemplates.com 2009

Back to TOP