[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