Te estás olvidando de asignar el parámetro <b>NodoLugar* lugaresVisita</b><br><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"><div style="font-family:'courier new',monospace;font-size:x-small"><span style="color:rgb(34,34,34);font-family:'courier new',monospace;font-size:x-small;background-color:rgb(255,255,255)"><br>
</span></div><font face="courier new, monospace">void InsertarRecorrido(</font></span><font face="courier new, monospace"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)">NodoRecorrido** lista , char* guia, int numPersonas, NodoLugar* lugaresVisita)</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);background-color:rgb(255,255,255)">{</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> ...</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> // Introducir la información en el nuevo nodo</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> // strcpy(destino,fuente)</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> strcpy(nuevoNodo->guia, guia);</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> nuevoNodo->numPersonas = numPersonas;</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)">
<font color="#ff0000"><span style="background-color:rgb(255,255,255)">- nuevoNodo->lugaresVisita = NULL;</span><span style="background-color:rgb(255,255,255)"> </span></font></font><div><font color="#009900"><font face="courier new, monospace"><span style="background-color:rgb(255,255,255)">+ </span><span style="background-color:rgb(255,255,255)">nuevoNodo->lugaresVisita </span>= </font>
<span style="font-family:'courier new',monospace;background-color:rgb(255,255,255)">lugaresVisita;</span></font><font face="courier new, monospace"><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)">
<span style="color:rgb(34,34,34);background-color:rgb(255,255,255)"> ...</span><br style="color:rgb(34,34,34);background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);background-color:rgb(255,255,255)">}</span> </font><br>
<br><div class="gmail_quote">2012/9/18 Elois@ Guevara <span dir="ltr"><<a href="mailto:elo_mentemaestra@hotmail.com" target="_blank">elo_mentemaestra@hotmail.com</a>></span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<font color="#330099">Hola, tengo un problema. Es una tarea de la unversidad. Me piden hacer un programa con listas ligadas que permita agregar información de Recorridos y lugares, debe existir una lista de lugares y una lista de recorridos, todo esto lo implementé con nodos.<br>
Despues cada recorrido debe visitar por lo menos un lugar (o más) esto debe poder agregarlo el usuario y visualizar en un menú. Solo que no se como insertar una referencia a cada lugar de la lista en el nodo del recorrido (será con puteros dobles?). Tengo prohibido usar arreglos, todo debe hacerse con memoria dinámica. Gracias de antemano por leer esto.</font><div>
<font color="#330099"> Este es mi código:</font><br><br><font face="courier new, monospace" size="1">#include <iostream><br>#include <cstdlib><br>#include <cstring><br>#include <windows.h><br>using namespace std;<br>
<br>typedef int tipoDato;<br><br>// Estructura principal para Lugares<br>typedef struct NodoLugar<br>{<br> char* nombre;<br> char* ubicacion;<br> struct NodoLugar* siguiente; // Referencia al siguiente elemento<br>
<br>}NodoLugar;<br><br>NodoLugar* inicioL; <br><br>// Estructura para guardar la información de los recorridos<br>typedef struct NodoRecorrido{<br> char* guia;<br> int numPersonas;<br> NodoLugar* lugaresVisita;<br>
struct NodoRecorrido* siguiente;<br> <br>}NodoRecorrido;<br><br> <br>NodoRecorrido* inicioR;<br><br>// Función para mostrar el menu principal de opciones <br>int Menu();<br>//<br>int SubMenu();<br>// Función para hacer una pausa en la pantalla<br>
void Pausa();<br><br>//********** Funciones para lugares **************************<br><br>// Función para insertar un nuevo Lugar en la lista de lugares<br>void InsertarLugar(NodoLugar**, char*, char*); <br>// Función para eliminar un Lugar de la lista de lugares<br>
bool EliminarLugar(NodoLugar**, char*);<br>// Función para mostrar la lista de Lugares<br>void MostrarLugar(NodoLugar**);<br>// Función para verificar si la lista de lugares está vacía <br>bool ListaVacia(NodoLugar**);<br>
//<br>bool BuscarLugar(NodoLugar**, char*);<br><br>//********** Funciones para recorridos **************************<br><br>// Función para insertar un nuevo Recorrido en la lista de recorridos<br>void InsertarRecorrido(NodoRecorrido**, char*, int, NodoLugar* lugaresVisita); <br>
// Función para eliminar un Recorrido de la lista de recorridos<br>bool EliminarRecorrido(NodoRecorrido**, char*);<br>// Función para mostrar la lista de recorridos<br>void MostrarRecorrido(NodoRecorrido**);<br>// Función para verificar si la lista de recorridos está vacía <br>
bool ListaRecVacia(NodoRecorrido**);<br><br>// ***************** Función main ******************<br>int main()<br>{<br> int opc=0, o=0;<br> <br> // Datos de lugar<br> char* nombre;<br> char* ubicacion;<br>
<br>
// Datos de recorrido<br> char* guia;<br> int numPersonas;<br> NodoLugar* lugaresVisita;<br> <br> // Es necesario inicializar el "inicio" de ambas listas en NULL ya que al comienzo del programa están vacías<br>
inicioL=NULL;<br> inicioR=NULL;<br> <br> do<br> {<br> <br> opc=Menu();<br> <br> switch(opc)<br> {<br> case 1:<br> do{<br> o=SubMenu();<br>
}while(o < 1 || o > 2);<br> if(o == 1)<br> {<br> cout << " Nombre del lugar: ";<br> nombre=(char*)malloc(sizeof(char)*20);<br>
fflush(stdin);<br> gets(nombre);<br> cout << " Ubicacion del lugar: ";<br> ubicacion=(char*)malloc(sizeof(char)*50);<br> fflush(stdin);<br>
gets(ubicacion);<br> InsertarLugar(&inicioL, nombre, ubicacion);<br> }<br> <br> else<br> {<br> if(!&inicioL)<br>
{<br> cout<<"\n Lista de lugares vacia, para agregar un recorrido\ndebe existir por lo menos un lugar en la lista...\n";<br> break;<br> }<br>
cout << " Nombre del guia: ";<br> guia=(char*)malloc(sizeof(char)*30);<br> fflush(stdin);<br> gets(guia);<br> cout << " Numero de personas: ";<br>
cin >> numPersonas;<br> InsertarRecorrido(&inicioR, guia, numPersonas, inicioL);<br> }<br> break;<br> <br> case 2:<br> do{<br>
o=SubMenu();<br> }while(o < 1 || o > 2);<br> if(o == 1)<br> { <br> cout << " Nombre del lugar: ";<br> nombre=(char*)malloc(sizeof(char)*20);<br>
fflush(stdin);<br> gets(nombre);<br> EliminarLugar(&inicioL, nombre);<br> }<br> <br> else<br> {<br>
cout << " Nombre del guia: ";<br> guia=(char*)malloc(sizeof(char)*30);<br> fflush(stdin);<br> gets(guia);<br> cout << " Numero de personas: ";<br>
cin >> numPersonas;<br> EliminarRecorrido(&inicioR, guia);<br> }<br> break;<br> <br> case 3:<br> do{<br>
o=SubMenu();<br>
}while(o < 1 || o > 2);<br> if(o == 1)<br> { <br> cout<<"\n Lista de lugares: \n";<br> MostrarLugar(&inicioL); Pausa(); <br>
}<br> <br> else<br> {<br> cout<<"\n Lista de recorridos: \n";<br> MostrarRecorrido(&inicioR); Pausa();<br>
} <br> break;<br> <br> case 5:<br> break;<br> <br> case 0:<br> exit(0);<br> break;<br> <br>
default:<br> cout << "\a\n Opcion invalida!..."; <br> Sleep(800);<br> break;<br> }<br> <br> }while(opc != 0);<br> <br> return 0;<br>
}<br><br>// Menu de opciones<br>int Menu()<br>{<br> int opcion;<br> system("cls"); system("COLOR 4F");<br> cout << "\n === Recorridos ===\n\n";<br> cout << " 1. Insertar\n";<br>
cout << " 2. Eliminar\n";<br> cout << " 3. Mostrar\n";<br> cout << " 4. Buscar\n";<br> cout << " 5. Instrucciones\n";<br> cout << "\t\tOpcion o presione 0 para salir: ";<br>
/*<br> Especificaciones que faltan<br> Insertar lugares si repetir (Crear funcion que busque lugar por nombre *)<br> Modificar numero de personas (Funcion que muestre la lista con # y pregunte el numero de nodo<br>
Modificar nombre del guia (Funcion que muestre la lista con # y pregunte el numero de nodo busque ese nodo y cambie<br> Buscar los recorridos que van a un mismo lugar<br> Buscar los lugares de un recorrido<br> */<br>
cin >> opcion;<br> system("cls"); <br> return opcion;<br>}<br><br>int SubMenu()<br>{<br> int opc;<br> system("CLS");<br> cout << "\n 1. Lugar\n";<br> cout << " 2. Recorrido\n";<br>
cout << "\tOpcion: ";<br> cin >> opc;<br> system("CLS");<br> return opc;<br>}<br><br>void Pausa()<br>{<br> cout << "\a\n Presione una tecla para continuar...";<br>
fflush(stdin);<br> getchar();<br>}<br><br>bool ListaVacia(NodoLugar** nodo)<br>{<br> if(nodo == NULL)<br> return true;<br> return false;<br>}<br><br>void InsertarLugar(NodoLugar** lista , char* nombre, char* ubicacion)<br>
{<br> // Reservar memoria para insertar el nuevo nodo <br> NodoLugar* nuevoNodo=(NodoLugar*)malloc(sizeof(NodoLugar));<br> <br> //Si la memoria no es suficiente, salir de la función<br> if(nuevoNodo == NULL)<br>
return;<br> <br> // Reservar memoria para la nueva informacion<br> nuevoNodo->nombre=(char*)malloc(sizeof(char)*20);<br> nuevoNodo->ubicacion=(char*)malloc(sizeof(char)*30);<br> <br> // Introducir la información en el nuevo nodo<br>
// strcpy(destino,fuente)<br> <br> strcpy(nuevoNodo->nombre, nombre);<br> strcpy(nuevoNodo->ubicacion, ubicacion);<br> <br> //Verificar cuando la lista está vacía<br> if(ListaVacia(lista) == true)<br>
// Si está vacía, el nuevo nodo apunta al inicio<br> nuevoNodo->siguiente = (*lista);<br> <br> else<br> // Si no, hacer que el nuevo nodo apunte al siguiente elemento de la lista<br> nuevoNodo->siguiente= (*lista);<br>
<br> // Finalmente, el apuntador al ultimo elemento insertado es el nuevo nodo <br> (*lista) = nuevoNodo;<br> cout<< "\n El dato ha sido insertado correctamente..."; Sleep(800); <br>
}<br>
<br>bool EliminarLugar(NodoLugar** inicioLista, char* nombre)<br>{<br> // * Caso 1: Si la lista está vacía, salir de la función<br> if(ListaVacia(inicioLista)==true)<br> return false;<br> <br>
// Variable auxiliar tipo apuntador a Nodo, requiere recibir la posición del primer elemento de la lista <br>
NodoLugar* auxEliminar=(*inicioLista);<br> <br> // * Caso 2: Comparar si el dato insertado por el usuario es igual al primer dato de la lista<br> if(strcmp(auxEliminar->nombre, nombre) == 0)<br> { <br>
// Si es verdadero, recorrer el apuntador al inicio de la lista al siguiente elemento<br> (*inicioLista)=(*inicioLista)->siguiente;<br> <br> // Liberar la memoria del auxiliar<br> free(auxEliminar);<br>
<br> // Retornar verdadero porque el nodo se eliminó correctamente<br> return true;<br> }<br> <br> // * Caso 3: Si sólo hay un dato en la lista y no está el dato buscado<br> if (auxEliminar->siguiente == NULL)<br>
return false;<br> <br> // * Caso 4: El elemento puede estar en el resto de la lista <br> <br> // Variable auxiliar tipo apuntador a Nodo, para guardar la posición anterior al nodo que se va a eliminar<br>
NodoLugar* anterior= (*inicioLista);<br> <br> // Recorrer el apuntador auxEliminar a la siguiente posición<br> auxEliminar=(*inicioLista)->siguiente;<br> <br> // Buscar en el resto de la lista mientras no se encuentre el elemento y la lista no se acabe<br>
while(strcmp(auxEliminar->nombre, nombre) != 0 && auxEliminar != NULL)<br> {<br> // Si ya no hay más nodos, asignar NULL al auxEliminar<br> if(auxEliminar->siguiente == NULL)<br> auxEliminar = NULL;<br>
// Si aun hay nodos, recorrer el auxiliar al siguiente nodo<br> else<br> auxEliminar = auxEliminar->siguiente;<br> <br> // Recorrer el auxiliar que guarda la posición anterior al nodo que se va a eliminar al siguiente nodo<br>
anterior = anterior->siguiente;<br> }<br> <br> // Si auxEliminar no es nulo, se encontró el dato <br> if(auxEliminar != NULL)<br> {<br> // Si el dato es el último de la lista, asignar NULL al siguiente nodo<br>
if(auxEliminar->siguiente == NULL)<br> anterior->siguiente = NULL;<br> // Si no, el dato no es el ultimo, <br> else<br> anterior->siguiente = auxEliminar->siguiente;<br>
<br> // Liberar memoria de auxEliminar, se pierde la referencia <br> free(auxEliminar);<br> <br> // Retornar verdadero ya que el dato se eliminó correctamente<br> return true;<br>
}<br> <br> // Retornar falso ya que auxEliminar es NULL, entonces el dato no está en la lista<br> return false;<br>}<br><br><br>void MostrarLugar(NodoLugar** inicioLista)<br>{<br> // Indice para contar los elementos de la lista que se han mostrado<br>
int i=0;<br> <br> // Variable tipo apuntador auxiliar a Nodo para recorrer la lista<br> NodoLugar* auxVer=(*inicioLista);<br> <br> // Si la lista está vacía muestra un mensaje.<br> if(auxVer==NULL)<br>
cout << "\n\t\aLista vacia!...\n";<br> <br> // Mientras la lista no esté vacía<br> while( auxVer != NULL)<br> {<br> // Incrementa el contador<br> i++;<br> <br>
// Muestra los datos<br>
cout<<"\t"<<i<<".- Nombre: "<<auxVer->nombre;<br> cout<<"\tUbicacion: "<<auxVer->ubicacion<<endl;<br> // Si la lista está vacía, asignar nulo al auxiliar para cerrar el ciclo while<br>
if(auxVer == NULL) <br> auxVer = NULL;<br> // Si no, recorrer el apuntador auxiliar a la posición del siguiente elemento para continuar mostrando<br> else <br> auxVer = auxVer->siguiente; <br>
} <br> <br> cout<<"\n\t\aFin de registros...\n"<<"\tTotal: "<<i<<endl;<br>}<br><br>bool BuscarLugar(NodoLugar** inicioLista, char* nombre)<br>
{<br> <br> <br> int i=0;<br> NodoLugar* anterior;<br> NodoLugar* auxBusca=(*inicioLista);<br> <br> if(auxBusca==NULL)<br> {<br> cout<<"\a\n Lista vacia!...\n"; Sleep(700);<br> return false;<br>
}<br> <br> while(auxBusca != NULL )<br> {<br> i++;<br> if( strcmp(auxBusca->nombre,nombre)==0)<br> {<br> cout<<"\n El lugar buscado se encuentra en el nodo "<<i<<endl;<br>
return true;<br> }<br> else<br> {<br> anterior=auxBusca; <br> if(auxBusca == NULL) <br> auxBusca=NULL;<br> else <br> auxBusca=auxBusca->siguiente;<br>
}<br> <br> }<br> <br> cout<<"\n\n\a El lugar no se encuentra en la lista...\n"; Sleep(800); <br> return false; <br>}<br><br> <br> ////////////////////////////////////////////////<br>
<br> <br> bool ListaRecVacia(NodoRecorrido** nodoR)<br>{<br> if(nodoR == NULL)<br> return true;<br> return false;<br>}<br><br>void InsertarRecorrido(NodoRecorrido** lista , char* guia, int numPersonas, NodoLugar* lugaresVisita)<br>
{<br> // Reservar memoria para insertar el nuevo nodo <br> NodoRecorrido* nuevoNodo=(NodoRecorrido*)malloc(sizeof(NodoRecorrido));<br> <br> //Si la memoria no es suficiente, salir de la función<br> if(nuevoNodo == NULL)<br>
return;<br> <br> nuevoNodo->guia= (char*)malloc(sizeof(char)*30);<br> <br> // Introducir la información en el nuevo nodo<br> // strcpy(destino,fuente)<br> strcpy(nuevoNodo->guia, guia);<br>
nuevoNodo->numPersonas = numPersonas;<br> nuevoNodo->lugaresVisita = NULL;<br> <br> //Verificar cuando la lista está vacía<br> if(ListaRecVacia(lista) == true)<br> // Si está vacía, el nuevo nodo apunta al inicio<br>
nuevoNodo->siguiente = (*lista);<br> <br> else<br> // Si no, hacer que el nuevo nodo apunte al siguiente elemento de la lista<br> nuevoNodo->siguiente= (*lista);<br> <br> // Finalmente, el apuntador al ultimo elemento insertado es el nuevo nodo <br>
(*lista) = nuevoNodo;<br> cout<< "\n El dato ha sido insertado correctamente..."; Sleep(800); <br>}<br> <br>bool EliminarRecorrido(NodoRecorrido** inicioLista, char* guia)<br>{<br> // * Caso 1: Si la lista está vacía, salir de la función<br>
if(ListaRecVacia(inicioLista)==true)<br> return false;<br> <br> // Variable auxiliar tipo apuntador a Nodo, requiere recibir la posición del primer elemento de la lista <br> NodoRecorrido* auxEliminar=(*inicioLista);<br>
<br> // * Caso 2: Comparar si el dato insertado por el usuario es igual al primer dato de la lista<br> if(strcmp(auxEliminar->guia, guia) == 0)<br> { <br> // Si es verdadero, recorrer el apuntador al inicio de la lista al siguiente elemento<br>
(*inicioLista)=(*inicioLista)->siguiente;<br> <br> // Liberar la memoria del auxiliar<br> free(auxEliminar);<br> <br> // Retornar verdadero porque el nodo se eliminó correctamente<br>
return true;<br> }<br> <br> // * Caso 3: Si sólo hay un dato en la lista y no está el dato buscado<br> if (auxEliminar->siguiente == NULL)<br> return false;<br> <br> // * Caso 4: El elemento puede estar en el resto de la lista <br>
<br> // Variable auxiliar tipo apuntador a Nodo, para guardar la posición anterior al nodo que se va a eliminar<br> NodoRecorrido* anterior= (*inicioLista);<br> <br> // Recorrer el apuntador auxEliminar a la siguiente posición<br>
auxEliminar=(*inicioLista)->siguiente;<br> <br> // Buscar en el resto de la lista mientras no se encuentre el elemento y la lista no se acabe<br> while(strcmp(auxEliminar->guia, guia) != 0 && auxEliminar != NULL)<br>
{<br> // Si ya no hay más nodos, asignar NULL al auxEliminar<br> if(auxEliminar->siguiente == NULL)<br> auxEliminar = NULL;<br> // Si aun hay nodos, recorrer el auxiliar al siguiente nodo<br>
else<br> auxEliminar = auxEliminar->siguiente;<br> <br> // Recorrer el auxiliar que guarda la posición anterior al nodo que se va a eliminar al siguiente nodo<br> anterior = anterior->siguiente;<br>
}<br> <br> // Si auxEliminar no es nulo, se encontró el dato <br> if(auxEliminar != NULL)<br> {<br> // Si el dato es el último de la lista, asignar NULL al siguiente nodo<br> if(auxEliminar->siguiente == NULL)<br>
anterior->siguiente = NULL;<br> // Si no, el dato no es el ultimo, <br> else<br> anterior->siguiente = auxEliminar->siguiente;<br> <br> // Liberar memoria de auxEliminar, se pierde la referencia <br>
free(auxEliminar);<br> <br> // Retornar verdadero ya que el dato se eliminó correctamente<br> return true;<br> }<br> <br> // Retornar falso ya que auxEliminar es NULL, entonces el dato no está en la lista<br>
return false;<br>}<br><br><br>void MostrarRecorrido(NodoRecorrido** inicioLista)<br>{<br> // Indice para contar los elementos de la lista que se han mostrado<br> int i=0;<br> <br> // Variable tipo apuntador auxiliar a Nodo para recorrer la lista<br>
NodoRecorrido* auxVer=(*inicioLista);<br> <br> // Si la lista está vacía muestra un mensaje.<br> if(auxVer==NULL)<br> cout << "\n\t\aLista vacia!...\n";<br> <br> // Mientras la lista no esté vacía<br>
while( auxVer != NULL)<br> {<br> // Incrementa el contador<br> i++;<br> <br> // Muestra los datos<br> cout<<"\t"<<i<<".- Nombre del guia: "<<auxVer->guia;<br>
cout<<"\tNumero de personas: "<<auxVer->numPersonas<<endl;<br> // Si la lista está vacía, asignar nulo al auxiliar para cerrar el ciclo while<br> if(auxVer == NULL) <br>
auxVer = NULL;<br> // Si no, recorrer el apuntador auxiliar a la posición del siguiente elemento para continuar mostrando<br> else <br> auxVer = auxVer->siguiente; <br> } <br>
<br> cout<<"\n\t\aFin de registros...\n"<<"\tTotal: "<<i<<endl;<br>} </font><br></div>
<br>_______________________________________________<br>
Lista de correo Cconclase <a href="mailto:Cconclase@listas.conclase.net">Cconclase@listas.conclase.net</a><br>
<a href="http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net" target="_blank">http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net</a><br>
Bajas: <a href="http://listas.conclase.net/index.php?gid=2&mnu=FAQ" target="_blank">http://listas.conclase.net/index.php?gid=2&mnu=FAQ</a><br></blockquote></div><br></div>