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

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema basico con listas en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema basico con listas en C  (Leído 4,543 veces)
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Problema basico con listas en C
« en: 13 Abril 2016, 23:23 pm »

Buenas,

    Estoy tratando de recordar algo de C y punteros y tengo un problema demas de basico con listas:  sino la creo primero no me funciona el push()

Código:
#include <stdlib.h>
#include <stdio.h>

struct Node {
int value;
struct Node* next;
};


Node* new_node(int value){
Node * n = (Node *) malloc(sizeof(Node));
n->value = value;
n->next = NULL;
return n;
}


void print_list(Node* head)
{
Node *prev;

prev =  head;
while (prev)
{
printf("%d\n", prev->value);
prev = prev->next;
}
}


/*
Mock de lista circular
*/
Node* lista_circular()
{
Node *x,*y,*z,*head;

x = new_node(1); head = x;
y = new_node(2); x->next = y;
z = new_node(3); y->next = z;
z->next = x;

return x;
}

/*
Mock de lista lineal
*/
Node* lista_lineal()
{
Node *x,*y,*z;

x = new_node(1);
y = new_node(2); x->next = y;
z = new_node(3); y->next = z;

return x;
}


/////////////////////////////////////////////////////
//
//  OPERACIONES


/*
Cuenta nodos
*/
int count(Node *lista)
{
int c = 0;
Node *e;

e = lista;
while (e){
c++;
e = e->next;
}

return c;
}


/*
Insertar al final de la lista

Solo tiene sentido si la lista es lineal *
*/
void push(Node* lista, int value)
{
Node *e,*prev,*n;
int v;

// camino hasta el final de la lista (poco eficiente, mejor tener puntero al final)
e = lista;
while (e){
prev = e;
e = e->next;
}

// creo nodo
n = new_node(value);

if (lista == NULL)
{
lista = n;
//printf("Elem: %d\n",lista->value);
//printf("Elementos: %d\n",count(lista));
}
else
// inserto al final
prev->next = n;
}


int main() { 


Node *lista = NULL;

//lista = lista_lineal();
push(lista,20);
push(lista,40);

print_list(lista);
printf("Elementos: %d\n",count(lista));
}

Me ayudan ?


« Última modificación: 14 Abril 2016, 00:35 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #1 en: 13 Abril 2016, 23:26 pm »

¿Cómo metes cosas en una caja que no existe?

Tú mismo lo has dicho, hay que crearlo primero.


En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #2 en: 13 Abril 2016, 23:31 pm »

Amigo @ivancea96: 

     Es que al hacer el push() creo un nodo (alloco memoria, seteo el siguiente a NULL, ..)  y luego pregunto si la lista esta vacia (lista == NULL) y si es asi hago que apunte a ese nodo recien creado:

Código:
        // creo nodo
n = new_node(value);


if (lista == NULL)
{
// creo la lista
lista = n;
        }
 

Por eso no entiendo porque no me funciona (en que la estoy embarrando)   :-[
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #3 en: 14 Abril 2016, 00:35 am »

Oh, no leí el push.

En ese caso, pon "lista = push(lista, _)". En push retornas la lista nueva en caso de que haya sido creada, así que necesitarás asignarla.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema basico con listas en C
« Respuesta #4 en: 14 Abril 2016, 00:36 am »

Respuesta rápida:
Los parámetros de una función son una copia local del argumento de llamada.
Respuesta algo menos rápida:
Debes pasar un puntero a lista como argumento de la función.
Te doy media solución:
void push(lista **head, int value);

A partir de aquí me detengo y te invito a pensar porqué debe ser así.
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #5 en: 14 Abril 2016, 00:37 am »

@MAFUS: estaba pensando justamente que es que esta pasando por valor y no por referencia pero luego me puse a pensar....... pero si es un puntero o no ?

Voy a probar lo que me dices (que lo habia pensado) pero no entiendo el fundamento.


@ivancea96:
gracias por responder, ni idea que se supone hace (_) pero me da error:

Citar
error: '_' was not declared in this scope
« Última modificación: 14 Abril 2016, 00:40 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #6 en: 14 Abril 2016, 00:38 am »

El _ era para que pusieras ahí lo que quisieras. El número que le pasas al push. Puse '_' porque no afectaba a la explicación xd
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #7 en: 14 Abril 2016, 01:00 am »

@MAFUS:

Bueno...... he reflexionado y entendido lo que me dices (el problema es que intento modificar un puntero en el caso de que no exista la linea pero pasa por valor) pero no logro hacerlo funcionar....  :-(

Serias tan amable de mostrarme como se hace ?  no soy estudiante, ni siquiera soy del area de "sistemas", es solo un hobbie pero me esta sacando chispas.

Gracias desde ya
« Última modificación: 14 Abril 2016, 01:05 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema basico con listas en C
« Respuesta #8 en: 14 Abril 2016, 15:53 pm »

Está un poco modificado pues defino un puntero directamente, pero los argumentos de push y pop esperan un puntero a puntero.

Como pusiste un ejemplo con push supuse que era una pila, así que el ejemplo implementa una pila.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct nodo_t {
  5.    int valor;
  6.    struct nodo_t* siguiente;
  7. } nodo, *pila;
  8.  
  9. pila nueva_pila() {
  10.    return NULL;
  11. }
  12.  
  13. void push(pila *l, int n) {
  14.    nodo *nuevo = malloc(sizeof(nodo));
  15.    nuevo->valor = n;
  16.    nuevo->siguiente = *l;
  17.    *l = nuevo;
  18. }
  19.  
  20. int pop(pila *l, int *dato) {
  21.    int exito = 0;
  22.    *dato = 0;
  23.    nodo* a_borrar;
  24.    if(*l) {
  25.        *dato = (*l)->valor;
  26.        a_borrar = *l;
  27.        *l = (*l)->siguiente;
  28.        free(a_borrar);
  29.        exito = 1;
  30.    }
  31.    return exito;
  32. }
  33.  
  34. int main() {
  35.    pila mi_pila;
  36.    int valor;
  37.    int exito;
  38.  
  39.    mi_pila = nueva_pila();
  40.    push(&mi_pila, 3);
  41.    push(&mi_pila, 5);
  42.    exito = pop(&mi_pila, &valor);
  43.    if(exito) printf("%i\n", valor);
  44.    exito = pop(&mi_pila, &valor);
  45.    if(exito) printf("%i\n", valor);
  46.    exito = pop(&mi_pila, &valor);
  47.    if(exito) printf("%i\n", valor);
  48.  
  49.    return 0;
  50. }
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema basico con listas en C
« Respuesta #9 en: 14 Abril 2016, 16:14 pm »

@MAFUS:  te agradezco mucho, tus ejemplos son los mejores (ya habia visto otros tuyos con punteros aqui) y me sirven para aprender.

Te puedo consultar que haces aqui ?

Código:
typedef struct nodo_t {
    int valor;
    struct nodo_t* siguiente;
} nodo, *pila;
 

No entiendo la parte en que llamas al struct nodo_t como nodo pero tambien puntero a pila y ni siquiera sabria como buscar eso que haces que no se como se llama  :xD

Tu ejemplo corre perfectamente y lo estoy estudiando en mas detalle.


PD: no estaba implementando una pila pero definí un push en vez de un insertar porque era de las operaciones mas simples posibles para probar con que me podia encontrar ya que habia visto este tema en Pascal pero como que los punteros pasan por referencia.
En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Problema con Listas
Java
HadesDark 2 2,369 Último mensaje 9 Noviembre 2007, 22:00 pm
por Ragnarok
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,096 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Problema con listas enlazadas.
Programación C/C++
samur88 9 4,893 Último mensaje 4 Diciembre 2010, 19:18 pm
por EddyC
algo basico super basico pero que no me sale
Programación C/C++
Freelancer 6 4,181 Último mensaje 22 Septiembre 2011, 03:25 am
por Freelancer
Problema con listas en Python (Resuelto)
Scripting
MA40 2 6,326 Último mensaje 6 Abril 2012, 12:32 pm
por MA40
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines