DUDA c++ (celdas enlazadas)

P4tr1

Hola buenas, es una chorrada seguro pero ahora mismo no veo el fallo:

mi estructura es:

struc celdaSD{
   double info;
   celdaSD *sig;
};

bien pues tengo una función para calcular el tamaña que tiene:

int sizeSD(celdaSD *v){
   int salida = 0;

   celdaSD *aux = v;
   while (aux != 0){
     aux = aux->sig;
     salida++;
   }
   return salida;
}

pues no me va con esto

luego cuando en el main llamo a función con un tipico cout:

cout << "y el tamaño de la lista es: " << sizeSD(p) << endl;

me da violación de segmento :S

r2d2rigo

#1 seguro que te falla ahi?

1 respuesta
HeXaN

#1 ¿Con aux -> sig != 0 también te falla?

1 respuesta
P4tr1

#3 con aux->sig != 0 me falla igual

#6 tengo más, las tipicas de liberar añadir al final una nueva celda, eliminar, etc.
lo que pasa es que al no irme bien el size tengo que pasarle el tamaño

1 respuesta
P4tr1

#2 yo creo que si, porque tengo otras funciones como mostrar valores añadir nuevas celdas y me funcionan bien (eso si les tengo que pasar por algumento una variable con el tamaña, ya que la funcion size no me va bien)

asi creo la creo:

for(int i = 0; i < tama; i++){
		cout << "introduce el valor para la celda " << i << " : " <<endl;
		cin >> valor;
		celdaSD *aux;
		aux = new celdaSD;
		aux->info = valor;
		aux->sig = p;
		p = aux;
	}
2 respuestas
HeXaN

#4 ¿Y tu programa sólo hace eso o lo tienes con más código? Porque así a simple vista no veo que esté mal :S

#5 Pues comenta todo lo demás y simplemente pásale una lista con datos y que te los cuente. Tienes que ir acotando la cosa.

cabron

#5

¿Qué entorno de desarrollo estás usando? Si actualmente no tienes un entorno que te diga la línea exacta del error deberías actualizar a algo más productivo. El código que has puesto está bien:


#include <iostream>

struct celdaSD{
    double info;
    celdaSD *sig;
    
celdaSD() { sig = nullptr; } }; int sizeSD(celdaSD *v){ int salida = 0;
celdaSD *aux = v; while (aux != nullptr){ aux = aux->sig; salida++; } return salida; } int main(int argc, const char * argv[]) {
celdaSD p; p.sig = new celdaSD(); p.sig->sig = new celdaSD(); p.sig->sig->sig = new celdaSD(); std::cout << sizeSD(&p) << "\n"; return 0; }

imprime 4

P4tr1

como harías para hacer una función para añadir al final de la lista de celdas enlazadas que tuviera como parámetros estos:

void Aniadir(celdaSD *v, double nuevo );

asi lo estoy intentando hacer:

void Aniadir(celdaSD *v, double nuevo){

   celdaSD *n = new celdaSD;
   (*n).info = nuevo;
   (*n).sig = 0;
   if((*v).sig == 0)   // quiere decir que sera la primera celda
     v = n;
   else{
      celdaSD *aux = v;
      while( aux != 0){
         aux = aux->sig;
        /* aqui tendría que poner algo más
         if((*aux).sig == 0)
             aux->sig = n;
        */
      }
   }


}
1 respuesta
HeXaN

#8 Simplemente usa un puntero aux y llévalo al último nodo. Ahí creas un nodo nuevo y metes el valor.

1 respuesta
P4tr1

#9 me da violación de segmento, cuando voy a introducir, te pongo datos del main :

void aniadirSD_II(celdaSD *v, double nuevo){   //tal cual el código de arriba
...
}

int main (){
   celdaSD *p;
   double valor = 0;
   int tama = 0;

   cout << "dime el tamaño que quieres de celdas enlazadas" << endl;
   cin >> tama;
   for(int i = 0; i < tama; i++){
    cout  << "introduce el valor para la celda " << i << " : " << endl;
    cin >> valor;
    aniadirSD_II(p, valor);
   }
}

creo que estará mal lo del bucle while para recorre

1 respuesta
HeXaN

#10 ¿Programas con papel y bolígrafo? El tema de punteros es así. Tienes que primero dibujarte el funcionamiento del problema, pintar los bucles, ver lo que hacen y cuando lo tengas todo claro; se codifica.

sasher

Si cada vez que aparezca una violación de segmento en tu vida no vas a saber que hacer...

Estas cosas se depuran para llegar a la raíz del problema. Y se depuran con un depurador, no mirando al código durante horas haciendo tu la traza mentalmente.

1 respuesta
HeXaN

#12 Las violaciones de segmento que le dan a él se resuelven haciendo el ejercicio en papel. Dudo que a estas alturas le hayan explicado cómo depurar/gdb.

1 respuesta
Fyn4r

#13 cuando uno explica C debería explicar también como depurar y como usar el manual. Si no mejor explica pascal o algo así xd

1 respuesta
HeXaN

#14 Pues no es algo que suelan hacer xD

1 respuesta
Fyn4r

#15 ya... xd

Usuarios habituales

  • Fyn4r
  • HeXaN
  • sasher
  • P4tr1
  • cabron
  • r2d2rigo