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;
}
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;
}
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
ResponderBorrarTal vez te falto incluir como header:
ResponderBorrar#pragma hdrstop
#include < conio.h >
#include < iostream.h >
#pragma argsused
la version del TC que usé :
Turbo C++ 3.0 de Borland.
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
ResponderBorrargracias
Gracias
ResponderBorrarmuy buena la informacion ingeniero miguel pero el programa no corre. buenos concejos gracias
ResponderBorrarHola 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++
ResponderBorrarHola 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++
ResponderBorrarlibrerias utilizadas
ResponderBorrar#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
no lo entiendo muy bien este tema de apuntadores,no se si podrian colgar mas ejemplos, asi como suma resta y otros gracias....
ResponderBorrarjajajaj que claros son hee apuntador que apunta jajajaja pero buena la inf he..........
ResponderBorrarsi corre el programa gracias solo falta incluir bibliotecas...
ResponderBorrar