Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Duda nodos C/C++

Estas en el tema de Duda nodos C/C++ en el foro de C/C++ en Foros del Web. Hola a todos, tengo otra dura, estuve practicando con los nodos y note que después de insertar nodos en una lista no puedo modificarlos/reutilizarlos porque ...
  #1 (permalink)  
Antiguo 14/01/2015, 12:07
 
Fecha de Ingreso: enero-2015
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Pregunta Duda nodos C/C++

Hola a todos, tengo otra dura, estuve practicando con los nodos y note que después de insertar nodos en una lista no puedo modificarlos/reutilizarlos porque si no me modifica la lista (creo que es porque apunto a esos nodos), alguien sabe como se crea un nodo empezando desde una lista? y como reescribir un nodo? así no tengo que crear un nodo nuevo todas las veces.
Mi código es el siguiente:

Código:
#include <iostream>

using namespace std;

//Estructura nodo...
typedef struct E1 {
    
    int dato;
    struct E1 *next;
    
} ELEMENTO;

typedef ELEMENTO *Lista;

int main(int argc, const char * argv[]) {
    
    /*** INSERTAR UN ELEMENTO EN UNA LISTA VACIA **/
    
    ELEMENTO nodo1 = {10, NULL};
    
    Lista nodo1Ptr = &nodo1;
    
    //Para ver el resultado
    //cout << nodo1.dato << " = " << nodo1Ptr->dato << endl;
    
    /*** INSERTAR UN ELEMENTO EN LA PRIMERA POSICION DE UNA LISTA ***/
    
    ELEMENTO nodo2 = {2,nodo1Ptr};
    
    nodo1Ptr = &nodo2;
    
    //Ver elementos de la lista:
    //cout << "Lista:\n" << nodo1Ptr->dato<< endl << nodo1Ptr->next->dato << endl;
    
    /*** INSERTAR UN ELEMENTO EN LA ULTIMA POSICION DELLA LISTA ***/
    
    Lista cursor1, temp;
    
    temp = nodo1Ptr;
    
    while (temp) {
        cursor1 = temp;
        temp = temp->next;
    }
    
    //Creamos un elemento para insertar en la lista
    ELEMENTO nodo3 = {4,NULL};
    
    cursor1->next = &nodo3;
    
    cout << "Lista:\n" << nodo1Ptr->dato<< endl << nodo1Ptr->next->dato << endl << nodo1Ptr->next->next->dato << endl;
    
    return 0;
}
Estoy siguiendo esta guia: http://www.c.conclase.net/edd/?cap=001b#1_4_3

Nota: El lenguaje de programación que estoy estudiando supuestamente es C++ pero nuestro profesor nos esta enseñando las estructuras que son de C... no le entiendo al final...

Gracias de antemano

Saludos

Última edición por Rufux; 14/01/2015 a las 13:34
  #2 (permalink)  
Antiguo 14/01/2015, 15:45
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años
Puntos: 38
Respuesta: Duda nodos C/C++

Lo debes hacer todo con bucles. Te dejo un source que te muestra como hacer para ver y editar. El caso es el mismo para ambos, se trata de ir pasando uno por uno hasta que encuentres el que quieres y entonces haces con el lo que quieras. XD

Supongo que estas estudiando sobre listas, ya que las listas se usa con memoria dinámica mejor. XD

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. //Estructura nodo...
  6. typedef struct E1 {
  7.  
  8.     int dato;
  9.     struct E1 *next;
  10.    
  11. } ELEMENTO;
  12.  
  13. typedef ELEMENTO *Lista;
  14.  
  15. int main ( int argc, const char *argv[] ) {
  16.     int nNodos = 0; //numero de nodos. No hay nodos aun
  17.     Lista lista = NULL; //inicia apuntando a null. QUiere decir que lista esta vacia.
  18.    
  19.     ELEMENTO nodo1 = {10, NULL};
  20.     ELEMENTO nodo2 = {20, NULL};
  21.     ELEMENTO nodo3 = {30, NULL};
  22.     ELEMENTO nodo4 = {40, NULL};
  23.     ELEMENTO nodo5 = {50, NULL};
  24.    
  25.     //lista apunta al primer luego el 1 apunta al 2, el 2 al 3 y asi sucesivamente hasta el ultimo.
  26.     lista = &nodo1;
  27.     nodo1.next = &nodo2;
  28.     nodo2.next = &nodo3;
  29.     nodo3.next = &nodo4;
  30.     nodo4.next = &nodo5;
  31.     nodo5.next = NULL;   //El ultimo debe apuntar a null que indica que no hay mas nodos
  32.    
  33.     nNodos = 5; // Ahora tenemos 5 nodos ;). cada vez que añadimos un nodo incrementamos nNodos ya que sirve de limite para los bucles al hacer busquedas y modificaciones.
  34.    
  35.     Lista nodo = lista;
  36.    
  37.     //esto para mostrar todos los nodos que hay hasta el momento
  38.     do{
  39.         cout << nodo->dato << endl;  //mostramos dato
  40.         nodo = nodo->next;          //preparamos el seguiente nodo
  41.  
  42.     }while( nodo != NULL  );
  43.    
  44.     //ahora editaremos uno de los nodos, pero primero debemos encontrarlo. Eso se hace con bucles.
  45.     nodo = NULL;             //<-la reutilizamos este punterito ;)
  46.     int nodoaEditar = 3;    // Paso de pedir con couts y chorradas XD, lo pongo aqui mismo el nodo que quiero editarXD
  47.     int i = 1;             //Empezamos por el primer nodo
  48.    
  49.     nodo = lista;
  50.     //este bucle pasa por todos los nodos hasta encontrar el nodo numero 3 que es el que puse en 'nodoaEditar'. Cuando lo encuentre se interrumpe el bucle y el bucle que queremos se queda guardado en el puntero 'nodo'
  51.     while ( i < nNodos ){  // Aqui se hace evidente para que queremos nNodos XD
  52.         if ( i == nodoaEditar ) {
  53.             cout << "\n\nNodo encontrado!: " << nodo->dato << endl;
  54.             break;  // como ya tenemos el nodo que queremos saltamos afuera.
  55.         }
  56.         nodo = nodo->next; //si no es el 3º nodo paso al siguiente
  57.         i++;
  58.     }
  59.    
  60.     //en ese punto el puntero 'nodo' apunta al 3º nodo que quiremos editar. puedes hacer nodo->dato = 100; y estaras editando el 3º nodo ;)
  61.     cout << "Nodo que tenemos!: " << nodo->dato << endl;
  62.    
  63.     //si quieres editar otro nodo es solo cambiar la variable nodoaEditar. Pero cuide no salir de rango ya que solo tenemos 5 nodos en ese caso, no vayas a editar un supuesto 6º nodo que no existe XD
  64.     return 0;
  65. }

Puedes usar variables para saber cuantos nodos tienes, o cual quieres editar, lo que sea.
Siempre debes recorrer la lista hacia adelante ya que solo tienes un puntero que apunta hacia adelante, y no hacia atrás.
Tampoco tienes un indice que te diga en que posición está, así que todo esas cosas las debes ingeniar tú para poder usar listas XDD

Creo que los ejemplos que te pasé son con memoria dinámica y son muy avanzados. Ni yo se mucho de listas.
Suerte!
  #3 (permalink)  
Antiguo 14/01/2015, 16:06
 
Fecha de Ingreso: enero-2015
Mensajes: 14
Antigüedad: 9 años, 9 meses
Puntos: 0
Respuesta: Duda nodos C/C++

Muchas gracias @vangodp!, al parecer no se puede usar un solo nodo, yo estaba pensando que estaba ocupando mucha memoria dejando nodos sin usar xD.
Gracias por código de ejemplo, me sirvió de mucha ayuda!
y tienes razón el código de esa pagina es avanzado, ademas esta en C y yo supuestamente estudio C++ xD.

Saludos
  #4 (permalink)  
Antiguo 14/01/2015, 17:04
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 11 años
Puntos: 38
Respuesta: Duda nodos C/C++

Si con lo de usar un solo nodo te refieres a que indicas el nodo y ¡BAM! ...Como los arreglos, pues no lo siento, debes recorrerla con bucles.
Tampoco es que yo entienda mucho de listas, pero esta en particular se trata de listas básicas, y estas tienen pocos mecanismos ya que su nombre lo dice todo: "Básicas".

Etiquetas: nodos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:56.