• Domingo 15 de Diciembre de 2024, 11:55

Autor Tema:  Listas enlazadas simples  (Leído 4185 veces)

Tragos2

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Listas enlazadas simples
« en: Sábado 1 de Junio de 2013, 01:54 »
0
Tengo problemas con entender la estructura para crear listas enlazadas, según yo es asi:
Código: [Seleccionar]
struct nodo // se crea la estructura de los nodos
{
    string info;
    struct nodo *sig;
};

int main()
{
   struct nodo *lista;
    struct nodo *nuevo;
    lista=Null;

}

pero como hago un nuevo nodo?, eh visto programas donde solicitan el numero de nodos a ingresar, no se puede dejar  indefinido y hacer cuantos nodos ingrese el usuario? :ayuda: los ejemplos que hay en internet no los logro descifrar  :losiento:

capsulasinformaticas

  • Nuevo Miembro
  • *
  • Mensajes: 2
  • Nacionalidad: 00
    • Ver Perfil
Re:Listas enlazadas simples
« Respuesta #1 en: Domingo 23 de Junio de 2013, 08:01 »
0
Tengo problemas con entender la estructura para crear listas enlazadas, según yo es asi:
Código: [Seleccionar]
struct nodo // se crea la estructura de los nodos
{
    string info;
    struct nodo *sig;
};

int main()
{
   struct nodo *lista;
    struct nodo *nuevo;
    lista=Null;

}

pero como hago un nuevo nodo?, eh visto programas donde solicitan el numero de nodos a ingresar, no se puede dejar  indefinido y hacer cuantos nodos ingrese el usuario? :ayuda: los ejemplos que hay en internet no los logro descifrar  :losiento:

Veo que escribiste el post hace tiempo, asi que te respondere asumiendo que tienes las mismas dudas todavia.

Primero que nada, cada estructura representa un nodo, cada nodo tendra un string y un puntero al siguiente nodo, el "conjunto de estructuras" en que cada una apunta a la siguiente sera la lista por asi decirlo. El puntero de tipo nodo en la funcion main llamada lista es simplemente un puntero al primer nodo de la lista.

Dejaremos a la funcion main como sigue:

Código: C++
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct nodo {
  6.         string info;
  7.         nodo *sig;
  8. };
  9.  
  10. int main() {
  11.         nodo *lista = NULL;
  12. }

Ahora, para crear un nuevo nodo usaremos el siguiente comando:

Código: C++
  1. new nodo;

Esto lo que hace es crear una estructura nodo en la memoria dinamica, y lo que devuelve la funcion new es la direccion en la memoria dinamica de ese nodo, entonces supongo ya sospechas donde asignarlo, lo que haremos sera asignar esa direccion de memoria a un puntero de la siguiente forma.

Código: C++
  1. nodo* p = new nodo;

El puntero p podra acceder a los campos sig e info del nodo estructura con (*p).info; o (*p).sig; pero para poder hacerlo mas facilmente se puede usar la siguiente notacion: p->info; o p->sig;

Ahora para hacer la funcion insertar podemos ir ingresando los nodos al principio o al final, es decir, si ingresamos en la lista primero "hola" y despues un "chao" la lista puede quedar: hola -> chao -> NULL o chao -> hola -> NULL, yo lo hare como el ultimo caso.

La funcion insertar quedaria como:

Código: C++
  1. void insertar(nodo *&lista, string frase) {
  2.         nodo *nuevo = new nodo;
  3.         nuevo->info = frase;
  4.         nuevo->sig = lista;
  5.         lista = nuevo;
  6. }

Entonces imaginate que en la funcion main se ponga:

Código: C++
  1. insertar(lista, pablo);

Lo que tendriamos seria que lista apuntaria a una estructura con el campo info igual a pablo y el campo sig igual a NULL;

Si usamos la funcion insertar denuevo de la siguiente forma:

Código: C++
  1. insertar(lista, patricio);

Lo que tendriamos seria que lista apuntaria a una estructura con el campo info igual a patricio y el campo sig apuntaria a la estructura que tiene como info a pablo, es decir la lista seria: patricio -> pablo -> NULL;

Ahora para ver la lista simplemente creamos la funcion mostrar asi:

Código: C++
  1. void mostrar(nodo *lista) {
  2.         while (lista) {
  3.                 cout << lista->info << " -> ";
  4.                 lista = lista->sig;
  5.         }
  6.        
  7.         cout << " NULL";
  8. }

Es decir mientras el puntero lista sea diferente de NULL, con cout mostramos el campo info del nodo y el puntero lista le asignamos la direccion de memoria del siguiente nodo.

Entonces si ejecutas:
Código: C++
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct nodo {
  6.         string info;
  7.         nodo *sig;
  8. };
  9.  
  10. void insertar(nodo *&lista, string frase) {
  11.         nodo *nuevo = new nodo;
  12.         nuevo->info = frase;
  13.         nuevo->sig = lista;
  14.         lista = nuevo;
  15. }
  16.  
  17. void mostrar(nodo *lista) {
  18.         while (lista) {
  19.                 cout << lista->info << " -> ";
  20.                 lista = lista->sig;
  21.         }
  22.        
  23.         cout << " NULL";
  24. }
  25.  
  26. int main() {
  27.         nodo *lista = NULL;
  28.        
  29.         insertar(lista, "pablo");
  30.         insertar(lista, "patricio");
  31.        
  32.         mostrar(lista);
  33. }

Deberias obtener como resultado; patricio -> pablo -> NULL.

Saludos.
« última modificación: Domingo 23 de Junio de 2013, 08:05 por capsulasinformaticas »