Sei sulla pagina 1di 17

LISTAS

Lista enlazada

• Una lista enlazada es una colección o secuencia de


elementos dispuestos uno detrás de otro, en la que
cada elemento se conecta al siguiente elemento por un
«enlace» o «puntero».
• La idea básica consiste en construir una lista cuyos
elementos llamados nodos se componen de dos partes
o campos: la primera parte o campo contiene la
información y es, por consiguiente, un valor de un tipo
genérico (denominado Dato, TipoElemento, Znfo, etc.)
y la segunda parte o campo es un puntero
(denominado enlace o sgte) que apunta al siguiente
elemento de la lista.
• La representación gráfica más extendida es aquella que utiliza una caja (un
rectángulo) con dos secciones en su interior. En la primera sección se
escribe el elemento o valor del dato y en la segunda sección, el enlace o
puntero mediante una flecha que sale de la caja y apunta al nodo
siguiente.
Declaración de un nodo

• Una lista enlazada se compone de una serie de


nodos enlazados mediante punteros. Cada nodo
es una combinación de dos partes: un tipo de
dato (entero, real, doble, carácter o tipo
predefinido) y un enlace (puntero) al siguiente
nodo.
• En C++, se puede declarar un nuevo tipo de dato
por un nodo mediante las palabras reservadas
struct que contiene las dos partes citadas
Declaración

struct Nodo{ typedef struct Nodo{


int dato; int dato;
struct Nodo* enlace; struct Nodo *enlace;
}; } NODO ;
Puntero de cabecera

• El acceso más frecuente a una lista enlazada es a


través del primer nodo de la lista que se llama
cabeza o cabecera de la lista. Un puntero al primer
nodo se llama puntero cabeza.

struct nodo *ptr _cabeza;


El puntero nulo
• Se puede utilizar el puntero nulo para
cualquier valor de puntero que no apunte a
ningún sitio. El puntero nulo se utiliza,
normalmente, en dos situaciones:
• Usar el puntero nulo en el campo enlace o siguiente del nodo
final de una lista enlazada.
• O Cuando una lista enlazada no tiene ningún nodo, se utiliza
el puntero NULL como puntero de cabeza. Tal lista se
denomina lista vacía.

Cabeza
• Si p es un puntero a una estructura y m es un
miembro de la estructura, entonces p -> m
accede al miembro m de la estructura
apuntada por P.
• printf ("%d", (*ptr_cabeza).dato);
(*ptr_cabeza) miembro dato del nodo apuntado por ptr_cabeza

• printf ("%d",(ptr_cabeza->dato));

P -> m significa lo mismo que (*p) . m


• Un algoritmo para la creación de una lista enlazada entraña
los siguientes pasos:
• Paso 1 . Declarar el tipo de dato y el puntero de cabeza o
primero.
• Paso 2. Asignar memoria para un elemento del tipo
definido anteriormente utilizando alguna de las funciones
de asignación de memoria (malloc() , calloc(), realloc( ) ) y
un cast para la conversión de void* al tipo puntero a nodo;
la dirección del nuevo elemento es ptr_nuevo.
• Paso 3. Crear iterativamente el primer elemento (cabeza) y
los elementos sucesivos de una lista enlazada simplemente.
• Puso 4. Repetir hasta que no haya más entrada para el
elemento
struct Elemento{
int dato;
struct Elemento * siguiente;
};
typedef struct Elemento Nodo;
main(){
Nodo *cabeza= NULL;
cabeza= (Nodo*)malloc(sizeof( Nodo)); //reservar memoria, tanta como tamaño tiene cada nodo
cabeza -> dato = 11;
cabeza-> siguiente = NULL;
}
cabeza 11 NULL
Nodo* crearNodo(int x, Nodo* enlace)
{
Nodo *p;
p = (Nodo*)malloc(sizeof(Nodo));
p->dato = x;
p->siquiente = enlace;
return p;
}
• La llamada a la función crearnodo ( ) para
crear el primer nodo de la lista:
cabeza= crearnodo(11, NULL);
• Si ahora se desea añadir un nuevo elemento
con un valor 6 , y situarlo en el primer lugar de
la lista se escribe simplemente:
cabeza= crearnodo(6, cabeza);
6 11
cabeza NULL
• El algoritmo empleado para añadir o insertar
un elemento en una lista enlazada varía
dependiendo de la posición en que se desea
insertar el elemento. La posición de inserción
puede ser:
1. En la cabeza (elemento primero) de la lista.
2. En el final de la lista (elemento último).
3. Antes de un elemento especificado.
4. Después de un elemento especificado
• Aunque normalmente se insertan nuevos datos al final de
una estructura de datos, es más fácil y más eficiente
insertar un elemento nuevo en la cabeza de una lista. El
proceso de inserción se puede resumir en este algoritmo:
1. Asignar un nuevo nodo apuntado por nuevo que es una
variable puntero local que apunta al nuevo nodo que se va
a insertar en la lista
2. Situar el nuevo elemento en el campo dato (Info) del
nuevo nodo.
3. Hacer que el campo enlace siguiente del nuevo nodo
apunte a la cabeza (primer nodo) de la
4. Hacer que cabeza (puntero cabeza) apunte al nuevo nodo
que se ha creado.
void insertarenCabeza(tipoNodo *cabeza, int d)
{
tipoNodo *nuevo;
nuevo=(tipoNodo *)malloc(sizeof(tipoNodo));
nuevo->Dato=d;
nuevo->sgt=cabeza;
cabeza=nuevo;
}
• Asignar el nuevo nodo apuntado por el puntero nuevo.
• Situar el nuevo elemento en el campo Nodo(Dato) del
nuevo nodo.
• Hacer que el campo enlace siguiente del nuevo nodo
apunte al nodo que va después de la posición del
nuevo nodo (o bien a NULL si no hay ningún nodo
después de la nueva posición).
• En la variable puntero anterior tener la dirección del
nodo que está antes de la posición deseada para el
nuevo nodo. Hacer que anterior -> siguiente apunte al
nuevo nodo que se acaba de crear.

Potrebbero piacerti anche