[C con Clase] ayuda por favor

Salvador Pozo salvador en conclase.net
Vie Feb 15 19:00:27 CET 2013


El pasado 2013-02-15 15:19:35, Marcela Bustamante escribió:
 
MB> Buenas tardes, este ejercicio me está presentando el error segmentation
MB> fault y la verdad que no tengo idea de que estoy haciendo mal desde ya
MB> muchas gracias por la ayuda o información que me puedan brindar

Hola:

He encontrado algunos errores, aunque puede que se me haya escapado alguno.

El primero está en la función de insertar.

----8<------
   else {
      /* Avanzamos hasta el último elemento o hasta que el siguiente tenga
         un valor mayor que v */
      while(actual-> siguiente && strncmp(actual->siguiente-> dato.Nombre,v.Nombre)< 0)
      {
          actual = actual-> siguiente;
      } // 1º error: Esta llave estaba a continuación del último "if", es aquí.
      /* Insertamos el nuevo nodo después del nodo anterior */
      nuevo->siguiente = actual-> siguiente;
      actual-> siguiente = nuevo;
      nuevo-> anterior = actual;
      if(nuevo->siguiente) nuevo->siguiente-> anterior = nuevo;
   }
----8<------

En la función Mostrar hay varios errores.

Para empezar, no necesitas pasar un puntero a la lista para esta función, ya que se supone que la función de mostrar no va a modificar la lista. En cualquier caso, si pasas un puntero, las referencias están mal:

----8<------
void mostrar(Lista *l)
{
    Lista aux;
    aux=*l; // 2º error: aux es de tipo lista, pero l es un puntero a lista
    if(aux) while(aux->anterior) aux = aux-> anterior; // Añadido
    while(aux) // 3º error: Si usas como condición aux->siguiente, no se muestra
               // el último elemento de la lista
    {
----8<------

La línea que he añadido es necesaria porque después de insertar un elemento es posible que lista no apunte al primer elemento de la lista, por eso retrocedo hasta el principio antes de mostrar la lista.

Por último, en main hay dos errores:

----8<------
int main(void)
{
    printf("Programa para crear una lista de datos\n ");
    Lista l = NULL;
//    l=(Lista)malloc(sizeof(tipoNodo));
//    l->anterior=l-> siguiente=NULL;
    int opcion=1;
----8<------

Primero, he comentado las líneas que añaden un elemento a la lista. Inicialmente la lista debe estar vacía, es decir, lista debe ser un puntero nulo.

Y finalmente, antes de abandonar el programa deberías liberar la memoria de la lista, es decir, borrar todos los elementos.

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase