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>