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

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


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

Desconectado Desconectado

Mensajes: 2


Ver Perfil
typedef struct con punteros
« en: 19 Abril 2019, 18:43 pm »

Hola,
Tengo una duda de como estoy entendiendo el tema de estructuras de datos con punteros. He estado buscando por el foro y no encuentro un problema similar que me aclare lo que hago mal.
Tengo estas estructuras:

Código:
// Libro
typedef struct {
    char* titulo;
    char* autor;
} tLibro;


// Nodo de una cola
typedef struct _tColaNode {
    tLibro l;
    struct _tColaNode* siguiente;
} tColaNode;


// Cola
typedef struct {
    tColaNode* primero;
    tColaNode* ultimo;
} tCola;

Entonces lo que estoy intentando es añadir varios elementos a la cola. Más allá del código quiero entender como lo hago porque me parece que lo estoy interpretando mal.
Lo primero que hago es comprobar si la cola está vacía y declaro un tLibro que quiero añadir y lo copio en tCola->tColaNode.primero
Después lo apunto al puntero ultimo para que sea tb el último ya que hay uno solo. Hasta aquí todo bien.

El tema es cuando añado el segundo, ahora mismo lo que hago es hacerlo a tCola->tColaNode.ultimo->siguiente que se supone que es el siguiente valor, no?
Pues aquí es donde creo que estoy interpretando mal la estructura y por lo tanto copiando donde no es.

Si me he explicado bien, alguien sabe donde me confundo?


En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: typedef struct con punteros
« Respuesta #1 en: 19 Abril 2019, 20:50 pm »

Como bien has comentado, lo estás interpretando mal. Lo primero que debemos tener en cuenta es un poco de teoría.
  • ¿Cómo funciona una cola?
Una cola es un contenedor de tipo FIFO (first in, first out) o lo que es lo mismo "el primero en entrar es el primero en salir". Es decir, es como una lista en el que las inserciones se hacen por un extremo y las expulsiones, por el otro. Pongamos un ejemplo de una cola en la que queremos meter los números del 1 al 5 en orden ascendente:
Código:
Cola1: 1
Cola2: 2 1
Cola3: 3 2 1
Cola4: 4 3 2 1
Cola5: 5 4 3 2 1
Y ahora vamos a sacar los elementos de la cola. Como hemos dicho antes se sacan por el extremo opuesto, entonces en este caso, por la derecha:
Código:
Expulsion1: 1    Cola: 5 4 3 2
Expulsion2: 2    Cola: 5 4 3
Expulsion3: 3    Cola: 5 4
Expulsion4: 4    Cola: 5
Expulsion5: 5    Cola: (vacia)

Teniendo esto claro, pasamos al código que tienes:
  • El puntero <siguiente> de <ultimo> siempre debe apuntar a NULL
  • Las inserciones siempre se hacen en <primero>. Entonces para una nueva inserción se hace siguiendo los siguiente pasos:
1. Crear nodo nuevo.
2. <siguiente> del nodo nuevo apunta al mismo nodo que <primero>
3. <primero> apunta al nuevo nodo.
  • Las expulsiones se hacen siempre del último nodo. Y los pasos serían los siguientes:
1. Llegamos hasta el penúltimo elemento.
2. Borramos la memoria del último elemento.
3. Hacemos que <ultimo> apunte al penúltimo.
4. Hacemos que <ultimo->siguiente> apunte a NULL.

Creo que no me he dejado nada; si no es así, pueden decírmelo para corregir lo que sea necesario.
Suerte :-X


En línea

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


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: typedef struct con punteros
« Respuesta #2 en: 19 Abril 2019, 21:35 pm »

No, a1ex la cola es un nodo como otro cualquiera, no es un nodo especial. Se considera el nodo de cola el último nodo (el que apunta null al siguiente).

El concepto de una lista es la de un sistema enlazado por nodos que apuntan hacia el nodo continuo. Cada Nodo dispone de su correspondiente información o mejor dicho el almacenamiento de información es el fin de la lista.

Código
  1. typedef struct {
  2.   Libro * libro;
  3.   void * siguienteNodo;   /* si es null, la lista acaba en este nodo */
  4. } Nodo;

Luego podrías crear funciones para que te den el tamaño, realicen b´suquedas, eliminen, etc.

« Última modificación: 19 Abril 2019, 22:00 pm por srWhiteSkull » En línea

srWhiteSkull


Desconectado Desconectado

Mensajes: 444



Ver Perfil WWW
Re: typedef struct con punteros
« Respuesta #3 en: 19 Abril 2019, 22:02 pm »

Ejemplo en C++ :

Código
  1. #include <iostream>
  2.  
  3. typedef struct {
  4.    int i=0;
  5.    void * nodoSiguiente;
  6. } Nodo;
  7.  
  8. void add(Nodo * lista, int i){
  9.    while (lista->nodoSiguiente!=NULL){
  10.        lista=(Nodo*)lista->nodoSiguiente;
  11.    }
  12.    lista->nodoSiguiente = new Nodo; //(Nodo*)malloc(sizeof(Nodo));
  13.    ((Nodo*)(lista->nodoSiguiente))->i=i;
  14.    ((Nodo*)(lista->nodoSiguiente))->nodoSiguiente=NULL; // cola
  15. }
  16.  
  17. int main(int argc, char** argv) {    
  18.    Nodo * lista= new Nodo; //(Nodo*)malloc(sizeof(Nodo));
  19.  
  20.    lista->i=666;
  21.    lista->nodoSiguiente= new Nodo; //(Nodo*)malloc(sizeof(Nodo));
  22.    ((Nodo*)(lista->nodoSiguiente))->i=999;
  23.    ((Nodo*)(lista->nodoSiguiente))->nodoSiguiente=NULL;
  24.  
  25.    add(lista, 123);
  26.    add(lista, 128);
  27.  
  28.    Nodo * nodo = lista;
  29.    while (nodo!=NULL){
  30.        printf("i= %d\n",nodo->i);
  31.        nodo=(Nodo*)nodo->nodoSiguiente;
  32.    }
  33.  
  34.    system("PAUSE");    
  35.    return 0;
  36. }

PD Lista simple! y Ojo! hay diferencias en el uso de punteros en C con respecto a C++. Si puedes trabajar con C++ mejor!
« Última modificación: 19 Abril 2019, 22:08 pm por srWhiteSkull » En línea

a1ex

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: typedef struct con punteros
« Respuesta #4 en: 20 Abril 2019, 11:23 am »

gracias a todos, ya lo veo más claro.
Y si, es en C (por ahora).

Gracias por la ayuda
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines