Gilberto 🦁 PRO
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales
Una lista ligada es una estructura de datos lineal en la que cada elemento (llamado nodo) se conecta a otro(s) mediante el uso de apuntadores
A diferencia de un arreglo, los nodos de la lista se encuentran en direcciones aleatorias de memoria
Podemos tener distintos tipos de listas, entre las que destacan:
Cada nodo se conforma de dos partes:
dato
Cada nodo se conforma de dos partes:
dato
El primer nodo en una lista recibe también el nombre de cabecera
Cuando la lista se encuentra vacía, la cabecera apunta a NULL
En este ejemplo ocurren varias cosas:
#include <stdio.h>
#include <stdlib.h>
//Estructura de un nodo para una lista ligada
struct Nodo
{
int dato;
struct Nodo *siguiente;
};
//Función para crear un nodo nuevo
struct Nodo* nuevoNodo(int dato) {
struct Nodo* n = (struct Nodo*)malloc(sizeof(struct Nodo));
n->dato = dato;
n->siguiente = NULL;
return n;
}
int main() {
}En este ejemplo ocurren varias cosas:
#include <stdio.h>
#include <stdlib.h>
//Estructura de un nodo para una lista ligada
struct Nodo
{
int dato;
struct Nodo *siguiente;
};
//Función para crear un nodo nuevo
struct Nodo* nuevoNodo(int dato) {
struct Nodo* n = (struct Nodo*)malloc(sizeof(struct Nodo));
n->dato = dato;
n->siguiente = NULL;
return n;
}
int main() {
struct Nodo *cabecera = NULL;
struct Nodo *n = NULL;
cabecera = nuevoNodo(5);
n = nuevoNodo(4);
n->siguiente = cabecera;
cabecera = n;
n = nuevoNodo(3);
n->siguiente = cabecera;
cabecera = n;
n = nuevoNodo(2);
n->siguiente = cabecera;
cabecera = n;
n = nuevoNodo(1);
n->siguiente = cabecera;
cabecera = n;
n = cabecera;
while (n != NULL) {
printf("%d ", n->dato);
n = n->siguiente;
}
}Limpiando un poquito el código anterior nos puede quedar algo así:
#include <stdio.h>
#include <stdlib.h>
//Estructura de un nodo para una lista ligada
struct Nodo
{
int dato;
struct Nodo *siguiente;
};
//Función para crear un nodo nuevo
struct Nodo* nuevoNodo(int dato) {
struct Nodo* n = (struct Nodo*)malloc(sizeof(struct Nodo));
n->dato = dato;
n->siguiente = NULL;
return n;
}
struct Nodo* agregaDato(struct Nodo *l, int dato) {
struct Nodo *n = NULL;
n = nuevoNodo(dato);
n->siguiente = l;
l = n;
n = NULL;
return l;
}
void imprimeLista(struct Nodo *l) {
struct Nodo *n = NULL;
n = l;
while (n != NULL) {
printf("%d ", n->dato);
n = n->siguiente;
}
}
int main() {
struct Nodo *cabecera = NULL;
struct Nodo *n = NULL;
cabecera=agregaDato(cabecera, 5);
cabecera=agregaDato(cabecera, 4);
cabecera=agregaDato(cabecera, 3);
cabecera=agregaDato(cabecera, 2);
cabecera=agregaDato(cabecera, 1);
imprimeLista(cabecera);
}Y si de verdad quieren que les duela la cabeza podrían intentar algo así:
#include <stdio.h>
#include <stdlib.h>
//Estructura de un nodo para una lista ligada
struct Nodo
{
int dato;
struct Nodo *siguiente;
};
//Función para crear un nodo nuevo
struct Nodo* nuevoNodo(int dato) {
struct Nodo* n = (struct Nodo*)malloc(sizeof(struct Nodo));
n->dato = dato;
n->siguiente = NULL;
return n;
}
void agregaDato(struct Nodo **l, int dato) {
struct Nodo *n = NULL;
n = nuevoNodo(dato);
n->siguiente = *l;
*l = n;
n = NULL;
}
void imprimeLista(struct Nodo *l) {
struct Nodo *n = NULL;
n = l;
while (n != NULL) {
printf("%d ", n->dato);
n = n->siguiente;
}
}
int main() {
struct Nodo *cabecera = NULL;
struct Nodo *n = NULL;
agregaDato(&cabecera, 5);
agregaDato(&cabecera, 4);
agregaDato(&cabecera, 3);
agregaDato(&cabecera, 2);
agregaDato(&cabecera, 1);
imprimeLista(cabecera);
}En lo general, la memoria no es un problema en sistemas modernos, pero es buena práctica revisar que:
#include <stdio.h>
#include <stdlib.h>
//Estructura de un nodo para una lista ligada
struct Nodo
{
int dato;
struct Nodo *siguiente;
};
//Función para crear un nodo nuevo
struct Nodo* nuevoNodo(int dato) {
struct Nodo* n = (struct Nodo*)malloc(sizeof(struct Nodo));
if (n != NULL) {
n->dato = dato;
n->siguiente = NULL;
}
return n;
}
struct Nodo* agregaDato(struct Nodo *l, int dato) {
struct Nodo *n = NULL;
n = nuevoNodo(dato);
if (n!=NULL) {
n->siguiente = l;
l = n;
n = NULL;
}
return l;
}
void imprimeLista(struct Nodo *l) {
struct Nodo *n = NULL;
n = l;
while (n != NULL) {
printf("%d ", n->dato);
n = n->siguiente;
}
}
int main() {
struct Nodo *cabecera = NULL;
cabecera = agregaDato(cabecera, 5);
cabecera = agregaDato(cabecera, 4);
cabecera = agregaDato(cabecera, 3);
cabecera = agregaDato(cabecera, 2);
cabecera = agregaDato(cabecera, 1);
imprimeLista(cabecera);
}Las operaciones básicas que podemos realizar en una lista son:
¿Cómo creen que sería el código para hacer cada una de esas operaciones?
By Gilberto 🦁
Listas ligadas
Desarrollo visualizaciones y aplicaciones en línea, colaboro con distintos medios digitales