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


 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Se puede imprimir lista simplemente enlazada al reves
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Se puede imprimir lista simplemente enlazada al reves  (Leído 3,163 veces)
dacima99

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Se puede imprimir lista simplemente enlazada al reves
« en: 22 Marzo 2018, 19:28 »

Si tengo una lista simplemente enlazada dinámica, ¿puedo imprimir info desde el último nodo hasta el primero?

Código:
typedef struct node{
int info;
struct node *next;
}Node;

typedef struct{
Node *firstnode;
int size;
}List;

¿Supongo que si que es posible, no?
Es decir, supongamos que creamos una función donde pasamos la lista por referencia, luego guardamos en un array de punteros todos los nodos de la lista. Después simplemente hemos de imprimir el array al inrevés y listo. Entonces no es necesario que el nodo tenga un puntero a previous o  la estructura List tenga un puntero a el último estado.

Si no estoy en lo correcto agradecería que me corrigieran.

Muchas gracias,

 :D



En línea

animanegra

Desconectado Desconectado

Mensajes: 281



Ver Perfil
Re: Se puede imprimir lista simplemente enlazada al reves
« Respuesta #1 en: 22 Marzo 2018, 20:04 »

¿Y de cuantos punteros haces el array?
Si te vas a pasear por el array para primero contar el numero de punteros, reservar la memoria del array y despues volver a recorrerlo para meter los punteros en el array para poder despues recorrer el array al reves, igual date un paseo por la lista enlazada cambiando los punteros siguiente y cambialos por los anteriores y lo recorres en sentido inverso.
Osea, mayormente, hazte una funcion que sea invierte punteros. y despues recorres el array invertido con tu funcion normal de imprimir.
No se si me explico.


En línea


42
No contesto mensajes por privado, si tienes alguna pregunta, consulta o petición plantéala en el foro para que se aproveche toda la comunidad.
ThunderCls


Desconectado Desconectado

Mensajes: 423


Coder | Reverser | Gamer


Ver Perfil WWW
Re: Se puede imprimir lista simplemente enlazada al reves
« Respuesta #2 en: 22 Marzo 2018, 20:11 »

Si tuvieras un puntero al siguiente nodo y otro al anterior ya no seria una lista "simplemente enlazada" sino "doblemente enlazada"  :xD
Una idea es crearte una funcion que trabaje con tu lista y cambie el sentido de los punteros (los punteros del nodo siguiente por el anterior):

1->2->3->4->5->NULL

quedaria como:

NULL<-1<-2<-3<-4<-5

una posible logica seria:

// antes de modificar curr->next
next = curr->next;

// cambias el sentido del puntero
curr->next = prev;

prev = curr;
curr = next;

Saludos
« Última modificación: 22 Marzo 2018, 20:15 por ThunderCls » En línea

-[ "…I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/
NEBIRE


Desconectado Desconectado

Mensajes: 2.312


Ver Perfil
Re: Se puede imprimir lista simplemente enlazada al reves
« Respuesta #3 en: 22 Marzo 2018, 21:04 »

Poderse, se puede... pero sin cambios es ineficiente.

aquí como:
Código:
    entero k = lista.Count-1
    nodo n

    bucle mientras (k>0)   
        n = nodoRaiz
        bucle desde 0 hasta k
            n = n.siguiente   
        fin bucle

        imprimir n.valor
        k -=1
    fin bucle
Suongamos que la lista tiene 6 elementos (0-5)
Fíjate, que primero debe llegar hasta el 5, para imprimirlo.
luego hasta el 4 y lo imprime
luego hasta el 3 y lo imprime
luego hasta el 2 y lo imprime
...
Cada nodo se visita entre 1 y n veces, en promedio cada nodo se visita: veces = ((n+1)\2)
Cuando una lista doblemente enlazada, o simplemente enlazada pero hacia abajo (esto es, al añadir nodos, se añaden en raíz, en vez de al final), basta con visitar cada nodo 1 sola vez.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.477



Ver Perfil
Re: Se puede imprimir lista simplemente enlazada al reves
« Respuesta #4 en: 22 Marzo 2018, 23:25 »

Pues sí, todo depende del orden en que le indiques que pase al siguiente elemento y escriba lo que hay guardado en el nodo.

Algo así. Fíjate en lista_imprimir y lista_imprimir_invertido.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <locale.h>
  4.  
  5. typedef struct tnodo {
  6.    int numero;
  7.    struct tnodo *siguiente;
  8. } nodo;
  9.  
  10. void lista_add(nodo **raiz, int numero) {
  11.    nodo *actual = *raiz;
  12.    nodo *aux = malloc(sizeof(nodo));
  13.  
  14.    aux->numero = numero;
  15.    aux->siguiente = NULL;
  16.  
  17.    if(!actual)
  18.        *raiz = aux;
  19.    else {
  20.        while(actual->siguiente)
  21.            actual = actual->siguiente;
  22.        actual->siguiente = aux;
  23.    }
  24. }
  25.  
  26. void lista_imprimir(nodo *raiz) {
  27.    if(raiz) {
  28.        printf("%d\n", raiz->numero);
  29.        lista_imprimir(raiz->siguiente);
  30.    }
  31. }
  32.  
  33. void lista_imprimir_invertido(nodo *raiz) {
  34.    if(raiz) {
  35.        lista_imprimir_invertido(raiz->siguiente);
  36.        printf("%d\n", raiz->numero);
  37.    }
  38. }
  39.  
  40. nodo * lista_nueva() {
  41.    return NULL;
  42. };
  43.  
  44. void lista_eliminar(nodo **raiz) {
  45.    if(*raiz) {
  46.        lista_eliminar(&(*raiz)->siguiente);
  47.        free(*raiz);
  48.        *raiz = NULL;
  49.    }
  50. }
  51.  
  52. int main() {
  53.    int i;
  54.    nodo *lista = lista_nueva();
  55.  
  56.    setlocale(LC_ALL, "spanish"); // Cosas mías para que windows saque acentos.
  57.  
  58.    for(i=1; i<=10; ++i)
  59.        lista_add(&lista, i);
  60.  
  61.    puts("Lista del derecho:");
  62.    lista_imprimir(lista);
  63.  
  64.    puts("\n");
  65.  
  66.    puts("List del revés:");
  67.    lista_imprimir_invertido(lista);
  68.  
  69.    lista_eliminar(&lista);
  70. }
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

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