<div dir="ltr">Hola Marcela,<br><div class="gmail_extra"><br></div><div class="gmail_extra" style>Veo que Salvador se me ha adelantado, pero te doy mi análisis del problema que llevaba escribiendo :)</div><div class="gmail_extra">
<br><div class="gmail_quote">2013/2/15 Marcela Bustamante <span dir="ltr"><<a href="mailto:marcela_bustamante@itrsa.com.ar" target="_blank">marcela_bustamante@itrsa.com.ar</a>></span><br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="ES-AR" link="blue" vlink="purple"><div><p>
Buenas tardes, este ejercicio me está presentando el error segmentation fault y la verdad que no tengo idea de que estoy haciendo mal desde ya muchas gracias por la ayuda o información que me puedan brindar<u></u><u></u></p>

<p><u></u> </p></div></div></blockquote><div>Veamos el programa. Te voy comentando a medida que vaya viendo el código fuente.<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="ES-AR" link="blue" vlink="purple"><div><p> <u></u></p><p>/*Ejercicio 8.2.<u></u><u></u></p><p>Repetir el ejercicio anterior creando una estructura struct dNode para una lista doblemente<u></u><u></u></p>
<p><span lang="EN-US">enlazada.*/<u></u><u></u></span></p><p><span lang="EN-US"><u></u> <u></u></span></p><p><span lang="EN-US">#include <stdio.h><u></u><u></u></span></p><p><span lang="EN-US">#include <stdlib.h><u></u><u></u></span></p>

<p><span lang="EN-US"><u></u> </span></p></div></div></blockquote><div><br></div><div>Te falta incluir <string.h>, porque usas la función 'strncmp()' en el programa.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="ES-AR" link="blue" vlink="purple"><div><p><span lang="EN-US"><u></u></span></p><p>//declaro la estructura la cual va a ser un tipo de dato que contiene nombre, apell y edad<u></u><u></u></p><p>
<span lang="EN-US">typedef struct sData<u></u><u></u></span></p><p><span lang="EN-US">{<u></u><u></u></span></p><p><span lang="EN-US">char Nombre[30];<u></u><u></u></span></p><p>char Apellido[30];<u></u><u></u></p>
<p>char Edad[10];<u></u><u></u></p><p>}tiposData;<u></u><u></u></p><p><u></u> <u></u></p><p>//Creo el nodo que va a contener el tipo de dato     tiposData dato;<u></u><u></u></p><p>
<u></u> <u></u></p><p> <span lang="EN-US">typedef struct Nodo<u></u><u></u></span></p><p><span lang="EN-US">{<u></u><u></u></span></p><p><span lang="EN-US">    tiposData dato;<u></u><u></u></span></p>
<p><span lang="EN-US">    </span>struct Nodo *anterior,*siguiente;<u></u><u></u></p><p>} tipoNodo;<u></u><u></u></p><p><u></u> <u></u></p><p><u></u> <u></u></p><p>typedef tipoNodo *pNodo;<u></u><u></u></p>
<p>typedef tipoNodo *Lista;<u></u><u></u></p><p><u></u> <u></u></p><p><u></u> <u></u></p><p>void Insertar(Lista *lista, tiposData v) {</p></div></div></blockquote><div><br></div><div>
En general, deberías pasar la dirección de una estructura en lugar de la estructura en sí. Esto es,</div><div><br></div><div>void Insertar( Lista *lista, const tiposData *pDato );<br></div><div><br></div>
<div>Obviamente, habría que tratarlo como un puntero en el código de la implementación de esta función.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>   pNodo nuevo, actual;<u></u><u></u></p><p><u></u> <u></u></p><p>   /* Crear un nodo nuevo */<u></u><u></u></p>
<p>   nuevo = (pNodo)malloc(sizeof(tipoNodo));<u></u><u></u></p><p>   nuevo->dato = v;<u></u><u></u></p><p><u></u> <u></u></p><p>   /* Colocamos actual en la primera posición de la lista */<u></u><u></u></p>
<p>   actual = *lista;<u></u><u></u></p><p>   if(actual) while(actual->anterior) actual = actual->anterior;<u></u><u></u></p><p><u></u> </p></div></div></blockquote><div><br></div><div>
Este bucle no es necesario. El doble puntero 'lista' apunta al primer nodo de la lista. No veo que necesites "retroceder". De hecho, esto puede ser problemático, si la lista apuntada realmente representa una sublista. Esto implica que 'Insertar()' no será general, al ser restrictiva al manejo de listas; es decir, no permite sublistas.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="ES-AR" link="blue" vlink="purple">

<div><p><u></u></p><p>   /* Si la lista está vacía o el primer miembro es mayor que el nuevo */<u></u><u></u></p><p>   if(!actual || strncmp(actual->dato.Nombre,v.Nombre) > 0) {</p></div></div>
</blockquote><div><br></div><div>Esto es incorrecto. La función 'strncmp()' requiere tres parámetros; el tercero indica la cantidad máxima de caracteres en la cadena del primer parámetro. En este caso, debería ser:<br>

<br>strncmp( actual->dato.Nombre, v.Nombre, 30 )<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>      /* Añadimos la lista a continuación del nuevo nodo */<u></u><u></u></p><p>      nuevo->siguiente = actual;<u></u><u></u></p>
<p>      nuevo->anterior = NULL;<u></u><u></u></p><p>      if(actual) actual->anterior = nuevo;<u></u><u></u></p><p>      if(!*lista) *lista = nuevo;<u></u><u></u></p><p>   }<u></u><u></u></p>
<p>   else {<u></u><u></u></p><p>      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga<u></u><u></u></p><p>         un valor mayor que v */<u></u><u></u></p><p>      while(actual->siguiente && strncmp(actual->siguiente->dato.Nombre,v.Nombre)< 0)</p>

</div></div></blockquote><div><br></div><div>Esto es un error. Hemos llegado a esta sentencia debido a que la condición de 'if' es falsa. Como la condición se basa en una expresión compleja, no sabes cuál subcondición falló: 'actual' o 'strncmp()'. Si la subcondición que contiene 'strncmp()' es falsa, entonces no tenemos graves problemas, pero si 'actual' es nulo, entonces sí tendremos muchos problemas al comenzar este bucle 'while', porque accedes a un miembro de una estructura que no existe.</div>

<div><br></div><div><br></div><div>Además, tienes el mismo error anterior. Escribe:<br><br>strncmp( actual->siguiente->dato.Nombre, v.Nombre, 30 )<br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>      {<u></u><u></u></p><p>          actual = actual->siguiente;<u></u><u></u></p><p>      /* Insertamos el nuevo nodo después del nodo anterior */<u></u><u></u></p>

<p>      nuevo->siguiente = actual->siguiente;<u></u><u></u></p><p>      actual->siguiente = nuevo;<u></u><u></u></p><p>      nuevo->anterior = actual;<u></u><u></u></p><p>      if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;<u></u><u></u></p>

<p>      }</p></div></div></blockquote><div><br></div><div>Podrías hacer todo esto, pero sinceramente no lo recomiendo. No obtienes ninguna ventaja al asignar repetidamente punteros a 'nuevo'. El bucle en sí sirve para buscar el nodo adecuado; de hecho, tu propio comentario así lo dice.</div>

<div><br></div><div>Una solución alternativa es simplemente buscar el nodo en el bucle. Una vez terminada la búsqueda - y fuera del bucle - es cuando preparamos 'nuevo' con los vínculos encontrados.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="ES-AR" link="blue" vlink="purple">

<div><p><u></u><u></u></p><p>   }<u></u><u></u></p><p>}<u></u><u></u></p><p><u></u> </p></div></div></blockquote><div><br></div><div>Aconsejo tratar el caso de la lista nula por separado y luego puedes mirar el caso general, teniendo en cuenta que la lista no está vacía.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div lang="ES-AR" link="blue" vlink="purple">

<div><p><u></u></p><p><u></u> <u></u></p><p><u></u> <u></u></p><p>//a la funcion mostrar solo se le pasa la lista<u></u><u></u></p><p>void mostrar(Lista *l)</p></div></div></blockquote><div><br></div><div style>No es necesario pasar el puntero de la lista. También ten presente que 'mostrar()' no tiene intención alguna de modificar el contenido de la lista.</div>
<div style><br></div><div style>Sugiero hacer esto:</div><div><br></div><div style>void mostrar( const Lista l )</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>
{<u></u><u></u></p><p>    Lista aux;<u></u><u></u></p><p>    aux=l;</p></div></div></blockquote><div><br></div><div style>Esto es un error, ya que los tipos no concuerdan. Debería haber sido:</div><div><br></div><div style>
aux = *l;</div><div style><br></div><div style>Ahora bien, si aplicas la sugerencia que hice antes sobre el tipo del parámetro, entonces puedes dejar esta sentencia como está. Eso sí, tendrías que cambiar el tipo de 'aux' para que concuerde con el del parámetro 'l'. Esto es,</div>
<div style><br></div><div style>const Lista aux;</div><div style><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>   </p></div></div></blockquote><div style>[CORTE]</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div lang="ES-AR" link="blue" vlink="purple"><div><p>int main(void)<u></u><u></u></p><p>{<u></u><u></u></p><p>    printf("Programa para crear una lista de datos\n ");<u></u><u></u></p><p>    Lista l;<u></u><u></u></p>

<p>    l=(Lista)malloc(sizeof(tipoNodo));<u></u><u></u></p><p>    l->anterior=l->siguiente=NULL;</p></div></div></blockquote><div><br></div><div>No aconsejo crear memoria ahora mismo, porque en realidad la lista está vacía. Por lo tanto, sólo debería ser:<br>
</div><div><br></div><div>Lista l = NULL;</div><div><br></div><div style>Obviamente, no asignaríamos valores a los campos del nodo, porque no existe tal nodo ahora mismo.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div lang="ES-AR" link="blue" vlink="purple"><div><p><u></u><u></u></p><p>    int opcion=1;<u></u><u></u></p><p>    tiposData dato;<u></u><u></u></p>
<p>    do<u></u><u></u></p><p>    {<u></u><u></u></p><p>        printf("Si desea ingresar un dato presione 1 de lo contrario salga con cualquier letra\n");<u></u><u></u></p><p>
        <span lang="EN-US">scanf("%d",&opcion);<u></u><u></u></span></p><p><span lang="EN-US">        if(opcion==1)<u></u><u></u></span></p><p><span lang="EN-US">        </span>{<u></u><u></u></p>
<p>           dato = ingresarDatos();<u></u><u></u></p><p>           Insertar(&l,dato);<u></u><u></u></p><p>           <span lang="EN-US">mostrar(&l);<u></u><u></u></span></p><p>
<span lang="EN-US">        }<u></u><u></u></span></p><p><span lang="EN-US">    }while(opcion==1);<u></u><u></u></span></p><p><span lang="EN-US"><u></u> <u></u></span></p><p><span lang="EN-US"><u></u> <u></u></span></p>
<p><span lang="EN-US">    return 0;<u></u><u></u></span></p><p>}<u></u><u></u></p></div></div></blockquote></div><br></div><div class="gmail_extra" style>Tienes un serio problema al final, porque no has desadjudicado la memoria que adjudicaste con 'malloc()'. Debes invocar 'free()' para cada nodo que creaste. Esto implica que debes recorrer la lista invocando 'free()' para cada nodo apuntado.</div>
<div class="gmail_extra"><br></div><div class="gmail_extra"><br></div><div class="gmail_extra" style>Espero que esto te aclare las dudas.</div><div class="gmail_extra"><br></div><div class="gmail_extra" style>Steven</div>
<div class="gmail_extra" style><br></div></div>