[C con Clase] ayuda por favor

Jose Roberto joser1993 en gmail.com
Vie Feb 15 18:13:36 CET 2013


El problema no es de compilación, si no de ejecución...

>    /* Colocamos actual en la primera posición de la lista */
>    actual = *lista;
>    if(actual) while(actual->anterior) actual = actual->anterior;

Creo que acá esta el error... Si bien estas en la primera posición de la lista, cuando pides el dato de su anterior, este será nulo o sin definir y hace el error de segmentación que estas menciónando... Primero has una validación en caso de haber datos nulos en la lista, este método get que te puede ayudar a entenderlo:

//sirve tanto para siguiente como para anterior, tan solo cambiar la variable

Nodo *getSiguiente(){

 if(actual->siguiente==NULL){
return; // esto con el fin que regrese ningún valor o dato
}else
return siguiente;
}

Para poder evaluar valores nulos debes añadir using namespace std; después de los include...

Espero haber ayudado
Jose Roberto Sánchez

El 15/02/2013, a las 09:19 a.m., "Marcela Bustamante" <marcela_bustamante en itrsa.com.ar> escribió:

> 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
>  
>  
> /*Ejercicio 8.2.
> Repetir el ejercicio anterior creando una estructura struct dNode para una lista doblemente
> enlazada.*/
>  
> #include <stdio.h>
> #include <stdlib.h>
>  
> //declaro la estructura la cual va a ser un tipo de dato que contiene nombre, apell y edad
> typedef struct sData
> {
> char Nombre[30];
> char Apellido[30];
> char Edad[10];
> }tiposData;
>  
> //Creo el nodo que va a contener el tipo de dato     tiposData dato;
>  
> typedef struct Nodo
> {
>     tiposData dato;
>     struct Nodo *anterior,*siguiente;
> } tipoNodo;
>  
>  
> typedef tipoNodo *pNodo;
> typedef tipoNodo *Lista;
>  
>  
> void Insertar(Lista *lista, tiposData v) {
>    pNodo nuevo, actual;
>  
>    /* Crear un nodo nuevo */
>    nuevo = (pNodo)malloc(sizeof(tipoNodo));
>    nuevo->dato = v;
>  
>    /* Colocamos actual en la primera posición de la lista */
>    actual = *lista;
>    if(actual) while(actual->anterior) actual = actual->anterior;
>  
>    /* Si la lista está vacía o el primer miembro es mayor que el nuevo */
>    if(!actual || strncmp(actual->dato.Nombre,v.Nombre) > 0) {
>       /* Añadimos la lista a continuación del nuevo nodo */
>       nuevo->siguiente = actual;
>       nuevo->anterior = NULL;
>       if(actual) actual->anterior = nuevo;
>       if(!*lista) *lista = nuevo;
>    }
>    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;
>       /* 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;
>       }
>    }
> }
>  
>  
>  
> //a la funcion mostrar solo se le pasa la lista
> void mostrar(Lista *l)
> {
>     Lista aux;
>     aux=l;
>     while(aux->siguiente)
>     {
>  
>         printf("El nombre es:%s\n",aux->dato.Nombre);
>         printf("El apellido es:%s\n",aux->dato.Apellido);
>         printf("La edad es:%s\n",aux->dato.Edad);
>         printf("\n");
>         aux=aux->siguiente;
>  
>             }
> }
>  
> tiposData ingresarDatos()
> {
>     tiposData nuevoDato;
>     printf("Ingrese Nombre\n");
>     scanf("%s",nuevoDato.Nombre);
>     printf("Ingrese Apellido\n");
>     scanf("%s",nuevoDato.Apellido);
>     printf("Ingrese Edad\n");
>     scanf("%s",nuevoDato.Edad);
>     return nuevoDato;
> }
>  
> int main(void)
> {
>     printf("Programa para crear una lista de datos\n ");
>     Lista l;
>     l=(Lista)malloc(sizeof(tipoNodo));
>     l->anterior=l->siguiente=NULL;
>     int opcion=1;
>     tiposData dato;
>     do
>     {
>         printf("Si desea ingresar un dato presione 1 de lo contrario salga con cualquier letra\n");
>         scanf("%d",&opcion);
>         if(opcion==1)
>         {
>            dato = ingresarDatos();
>            Insertar(&l,dato);
>            mostrar(&l);
>         }
>     }while(opcion==1);
>  
>  
>     return 0;
> }
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130215/8ee83863/attachment.html>


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