Tengo problemas con entender la estructura para crear listas enlazadas, según yo es asi:
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? los ejemplos que hay en internet no los logro descifrar
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:
#include <iostream>
using namespace std;
struct nodo {
string info;
nodo *sig;
};
int main() {
nodo *lista = NULL;
}
Ahora, para crear un nuevo nodo usaremos el siguiente comando:
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.
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:
void insertar(nodo *&lista, string frase) {
nodo *nuevo = new nodo;
nuevo->info = frase;
nuevo->sig = lista;
lista = nuevo;
}
Entonces imaginate que en la funcion main se ponga:
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:
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:
void mostrar(nodo *lista) {
while (lista) {
cout << lista->info << " -> ";
lista = lista->sig;
}
cout << " NULL";
}
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:
#include <iostream>
using namespace std;
struct nodo {
string info;
nodo *sig;
};
void insertar(nodo *&lista, string frase) {
nodo *nuevo = new nodo;
nuevo->info = frase;
nuevo->sig = lista;
lista = nuevo;
}
void mostrar(nodo *lista) {
while (lista) {
cout << lista->info << " -> ";
lista = lista->sig;
}
cout << " NULL";
}
int main() {
nodo *lista = NULL;
insertar(lista, "pablo");
insertar(lista, "patricio");
mostrar(lista);
}
Deberias obtener como resultado; patricio -> pablo -> NULL.
Saludos.