elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Borrar nodos pasados por parametro valor/referencia
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Borrar nodos pasados por parametro valor/referencia  (Leído 2,638 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Borrar nodos pasados por parametro valor/referencia
« en: 25 Diciembre 2018, 21:41 pm »

Buenas chicos, me surgio una duda, como debo pasar un nodo dentro de un procedimiento si se da el caso de que quiero borrarlo ahi? por valor o referencia? A mi se me hace que por valor/referencia da lo mismo ustedes que dicen?

Código
  1. //Definicion de la estructura
  2. const int MAX=8;
  3. typedef struct tnodo *pnodo;
  4. typedef struct tnodo{
  5. int dato;
  6. pnodo sig;
  7. };
  8. typedef struct tpila{
  9. pnodo inicio;
  10. pnodo final;
  11. int contador;
  12. };
  13.  
  14. void binario(int n)
  15. {
  16. tpila pila;
  17. pnodo nuevo, eliminado;
  18. init_stack(pila);
  19. while(n>0){
  20. crear_nodo(nuevo,n%2);
  21. push_stack(pila,nuevo);//Bueno aqui llama a push_stack(estructura pila, nodo nuevo);
  22. n/=2;
  23. }
  24. cout<<"Binario: ";
  25. while(empty_stack(pila)==false){
  26. eliminado=pop_stack(pila);
  27. cout<<eliminado->dato;
  28. delete(eliminado);
  29. }
  30. cout<<endl;
  31. }
  32.  
  33. //Aca es donde me vino la duda
  34. void push_stack(tpila &pila, pnodo nuevo)//Justo aquí
  35. {
  36. if(full_stack(pila)==true){
  37. cout<<"Pila llena"<<endl;
  38. delete(nuevo);//<---Y aquí
  39. }
  40. else{
  41. if(pila.inicio==NULL){
  42. pila.inicio=nuevo;
  43. pila.final=nuevo;
  44. }
  45. else{
  46. pila.final->sig=nuevo;
  47. pila.final=nuevo;
  48. }
  49. pila.contador++;
  50. }
  51. }


En línea

7w7
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #1 en: 26 Diciembre 2018, 01:07 am »

Te paso una pila básica codificada en C. Espero que te sirva.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4. #include <locale.h>
  5.  
  6. typedef struct tpila {
  7.    int dato;
  8.    struct tpila *siguiente;
  9. } pila;
  10.  
  11. pila* pila_new() {
  12.    return NULL;
  13. }
  14.  
  15. bool pila_push(pila **top, int dato) {
  16.    bool retValue = false;
  17.    pila *nodo = malloc(sizeof(pila));
  18.  
  19.    if(!nodo)
  20.        goto final_pila_push;
  21.  
  22.    nodo->dato = dato;
  23.    nodo->siguiente = *top;
  24.    *top = nodo;
  25.  
  26.    retValue = true;
  27. final_pila_push:
  28.    return retValue;
  29. }
  30.  
  31. bool pila_pop(pila **top, int *dato) {
  32.    bool retValue = false;
  33.    pila *nodo = *top;
  34.  
  35.    if(!nodo)
  36.        goto final_pila_pop;
  37.  
  38.    *dato = nodo->dato;
  39.    *top = nodo->siguiente;
  40.  
  41.    free(nodo);
  42.  
  43.    retValue = true;
  44. final_pila_pop:
  45.    return retValue;
  46. }
  47.  
  48. bool pila_top(pila ** const top, int *dato) {
  49.    bool retValue = false;
  50.  
  51.    if(!*top)
  52.        goto final_pila_top;
  53.  
  54.    *dato = (*top)->dato;
  55.  
  56.    retValue = true;
  57. final_pila_top:
  58.    return retValue;
  59. }
  60.  
  61. void pila_free(pila **top) {
  62.    pila *nodo;
  63.  
  64.    while(*top) {
  65.        nodo = *top;
  66.        *top = nodo->siguiente;
  67.        free(nodo);
  68.    }
  69. }
  70.  
  71. int main() {
  72.    int n;
  73.    pila *p = pila_new();
  74.  
  75.    setlocale(LC_ALL, "spanish");
  76.  
  77.    pila_push(&p, 5);
  78.    pila_push(&p, 2);
  79.    pila_push(&p, 3);
  80.  
  81.    pila_top(&p, &n);
  82.    printf("En la pila está el valor %d\n", n);
  83.  
  84.    pila_pop(&p, &n);
  85.    printf("Se saca de la pila el valor %d\n", n);
  86.  
  87.    pila_pop(&p, &n);
  88.    printf("Se saca de la pila el valor %d\n", n);
  89.  
  90.    pila_free(&p);
  91. }


En línea

Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #2 en: 26 Diciembre 2018, 20:00 pm »

La verdad lo dejé por valor porque si lo elimina, hice las pruebas correspondientes con delete(puntero), tenia algo de duda porque cuando liberamos/borramos un binary tree search el procedimiento tiene al arbol por referencia.  ;-)

Código
  1. void free_bst(bst &a)
  2. {
  3. if(a!=NULL){
  4. free_bst(a->left);
  5. free_bst(a->right);
  6. delete(a);
  7. a=NULL;
  8. }
  9. }
« Última modificación: 27 Diciembre 2018, 18:17 pm por Beginner Web » En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #3 en: 27 Diciembre 2018, 09:37 am »

No estoy del todo seguro pero si se trata de punteros creo que no es necesario pasarlo por referencia. Esto es porque un puntero contiene una dirección de memoria, no un dato como tal (variable u objeto).
Si se trata de una variable/objeto hay que pasarlo por referencia porque sino se crea una copia al pasarlo por valor y lo que modificamos es la copia, no el original. Pero al tratarse de punteros, estamos pasando una dirección de memoria, entonces aunque se cree una copia del parámetro y se trabaje sobre la copia, la copia es una dirección de memoria (la misma que el puntero original y por esto es que también funciona). Si se quiere reservar memoria sobre un puntero entonces sí hay que pasarlo por referencia.

Por otra parte el tema de que para un BST se pase por referencia es porque así evitas que la función copie todo el BST por valor. Muchas veces se aprovecha el paso por referencia cuando se trabaja con objetos de gran tamaño para evitar que se haga una copia y así ahorrar espacio en memoria. Por eso hay funciones que reciben objetos constantes por referencia, que parece una tontería ya que al ser constante no se puede modificar pero se hace sólo para evitar que la función ocupe el doble de memoria haciendo una copia del objeto. Para objetos pequeños o variables sencillas es indiferente ya que el gasto de memoria es pequeño pero también podría hacerse. Lo más común es hacer esto con objetos que son muy grandes o que son dinámicos por si llegan a ser muy grandes.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #4 en: 27 Diciembre 2018, 11:13 am »

No estoy del todo seguro pero si se trata de punteros creo que no es necesario pasarlo por referencia. Esto es porque un puntero contiene una dirección de memoria, no un dato como tal (variable u objeto).
Si se trata de una variable/objeto hay que pasarlo por referencia porque sino se crea una copia al pasarlo por valor y lo que modificamos es la copia, no el original. Pero al tratarse de punteros, estamos pasando una dirección de memoria, entonces aunque se cree una copia del parámetro y se trabaje sobre la copia, la copia es una dirección de memoria (la misma que el puntero original y por esto es que también funciona). Si se quiere reservar memoria sobre un puntero entonces sí hay que pasarlo por referencia.

Por otra parte el tema de que para un BST se pase por referencia es porque así evitas que la función copie todo el BST por valor. Muchas veces se aprovecha el paso por referencia cuando se trabaja con objetos de gran tamaño para evitar que se haga una copia y así ahorrar espacio en memoria. Por eso hay funciones que reciben objetos constantes por referencia, que parece una tontería ya que al ser constante no se puede modificar pero se hace sólo para evitar que la función ocupe el doble de memoria haciendo una copia del objeto. Para objetos pequeños o variables sencillas es indiferente ya que el gasto de memoria es pequeño pero también podría hacerse. Lo más común es hacer esto con objetos que son muy grandes o que son dinámicos por si llegan a ser muy grandes.

Pero son nodos, no punteros solos
En línea

7w7
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #5 en: 27 Diciembre 2018, 12:27 pm »

Código
  1. typedef struct tnodo *pnodo;
  2. // ...
  3. void push_stack(tpila &pila, pnodo nuevo)
  4.  
El parámetro que mandas es <pnodo> y <pnodo> es un puntero a <tnodo>. Al final, lo que estás mandando es un puntero, pero en vez de ser un puntero a una variable es un puntero a un objeto pero no deja de ser un puntero.

Si tus funciones en vez de recibir un <pnodo> (puntero a <tnodo>)  como parámetro, recibiesen un <tnodo> entonces si tendrías que pasarlo por referencia si lo quieres modificar.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Re: Borrar nodos pasados por parametro valor/referencia
« Respuesta #6 en: 27 Diciembre 2018, 18:16 pm »

Haaaaaaaaaaa!!! mas claro que el agua imposible, graciasss  :laugh:
En línea

7w7
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Copiar un List en otro (Por valor no por referencia)
.NET (C#, VB.NET, ASP)
BlaineMonkey 5 11,566 Último mensaje 18 Febrero 2010, 13:16 pm
por raul338
Paso de parametro por referencia
Programación C/C++
abad023 5 3,401 Último mensaje 6 Diciembre 2011, 08:21 am
por x64core
Paso por valor y por referencia
Programación C/C++
RiCo9297 1 1,900 Último mensaje 15 Agosto 2016, 17:05 pm
por class_OpenGL
Borrar temas sin respuestas pasados 60 días.
Sugerencias y dudas sobre el Foro
HardC0d3 2 3,435 Último mensaje 26 Agosto 2017, 09:00 am
por Sesenabo
Cómo borrar mensajes de WhatsApp pasados los 7 minutos
Noticias
wolfbcn 0 1,740 Último mensaje 2 Noviembre 2017, 00:33 am
por wolfbcn
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines