UNIDAD 8 Tipos de datos dinámicos: Punteros · Listas enlazadas con punteros. Pilas. Colas. UNIDAD...

51
UNIDAD 8 Tipos de datos dinámicos: Punteros Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros. Procedimientos para asignación y liberación de memoria. Tipos de datos recursivos. Listas enlazadas con punteros. Pilas. Colas.

Transcript of UNIDAD 8 Tipos de datos dinámicos: Punteros · Listas enlazadas con punteros. Pilas. Colas. UNIDAD...

UNIDAD 8 Tipos de datos dinámicos: Punteros

Asignación dinámica de memoria. Uso de punteros. Inicialización y asignación de punteros. Procedimientos para asignación y liberación de memoria. Tipos de datos recursivos. Listas enlazadas con punteros. Pilas. Colas.

UNIDAD 8 Estructuras Dinámicas de Datos

Estructuras cuyo tamaño (en longitud o en numero de elementos) varia en el tiempo de ejecución.

UNIDAD 8 Lista Enlazada Simple

Cada nodo contiene un único enlace que conecta ese nodo al nodo siguiente o nodo sucesor.

UNIDAD 8 Lista Enlazada Doble

Cada nodo contiene dos enlaces, uno a su nodo predecesor y el otro a su nodo sucesor.

UNIDAD 8 Lista Circular Simplemente Enlazada

Una lista enlazada simplemente en la que el último elemento se enlaza al primer elemento (cabeza) de tal modo que la lista puede ser recorrida de modo circular.

UNIDAD 8 Lista Circular Doblemente Enlazada

Una lista doblemente enlazada en la que el ultimo elemento se enlaza al primer elemento y viceversa. Esta lista se puede recorrer de modo circular.

UNIDAD 8 Lista Enlazada Simple

UNIDAD 8 Lista Enlazada Simple: Definición

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»

NODO

UNIDAD 8 Lista Enlazada Simple: Nodo

- Contiene la información que queremos almacenar en la lista.

- Es un puntero que apunta al siguiente elemento en la lista.

- Almacena un dato de cualquier tipo.

UNIDAD 8 Lista Enlazada Simple: Nodo

struct nodo{

tipo_de_dato valor;

struct nodo* sgte;

}

Declaración de un nodo:

Vamos a representar un nodo mediante una estructura con dos campos:

Campo valor: Para almacenar el elemento de la lista.

Campo sgte: Puntero que permite el acceso al siguiente elemento de la lista.

UNIDAD 8 Lista Enlazada Simple: Ejemplo

struct nodo{

int valor;

struct nodo* sgte;

};

typedef struct nodo NODO;

Ejemplo: Lista de elementos enteros.

a) La lista tiene elementos:

Necesitamos un puntero que indique el inicio de la lista.

El puntero siguiente del último elemento debe indicar el fin de la lista = NULL.

UNIDAD 8 Lista Enlazada Simple: Ejemplo

struct nodo{

int valor;

struct nodo* sgte;

};

typedef struct nodo NODO;

Ejemplo: Lista de elementos enteros.

b) La lista no tiene elementos:

El inicio no apunta a nadie = NULL.

Operaciones

Agregar un elemento en la lista

Eliminar un elemento de la lista

Cantidad de elementos de la lista

Mostrar lista

Buscar un elemento en la lista

UNIDAD 8 Lista Enlazada Simple: Operaciones

Inicializar lista

Lista vacía?

Lista Enlazada Simple: Inicializar

Deseamos inicializar la lista en vacío. main(){

NODO* ini;

inicializar(&ini);

}

El modulo inicializar tiene un parámetro: inicio que recibe la dirección de la variable ini.

inicio Puntero que apunta a un NODO: NODO* inicio

Que además será modificado: NODO* *inicio

Indica el inicio de la lista

UNIDAD 8 Lista Enlazada Simple: Inicializar

RAM

inicio

ini 101 =*inicio

101

NULL El modulo debe asignar NULL a ini, lo que equivale a hacer *inicio=NULL.

UNIDAD 8 Lista Enlazada Simple: Agregar

Al inicio de la lista. INSERCION

Ordenada

Desordenada

Al final de la lista.

Antes de un elemento.

Después de un elemento.

Agregar al Inicio Deseamos insertar el elemento llamado elem en la lista enlazada. Como las inserciones se realizaran al inicio de la lista, la variable ini se modificara. main(){

NODO* ini;

scanf(«%i»,&elem);

agregar(&ini, elem);

}

El modulo agregar tiene dos parámetros:

El inicio de la lista, que recibe la dirección de ini y será modificado: NODO* *inicio;

El elemento a insertar: int e;

UNIDAD 8 Agregar al Inicio: Casos

Agregar en lista vacía: Inicio contiene NULL

1. Gestionar espacio para almacenar un nuevo nodo.

RAM

inicio

ini 101

101

NULL

=*inicio

nuevo

1101

1101

*nuevo

elem

7

e

7

UNIDAD 8 Agregar en lista vacía

1. Gestionar espacio para almacenar un nuevo nodo.

2. Asignar valores al nuevo nodo.

RAM

inicio

ini 101

101

NULL

=*inicio

nuevo

1101

1101

*nuevo

7 NULL

elem

7

e

7

UNIDAD 8 Agregar en lista vacía

RAM

inicio

ini 101

101

NULL

=*inicio

nuevo

1101

1101

*nuevo

7 NULL

1101

elem

7

e

7

1. Gestionar espacio para almacenar un nuevo nodo.

2. Asignar valores al nuevo nodo.

3. Actualizar el inicio de la lista.

UNIDAD 8

Agregar en lista no vacía

RAM

inicio

ini 101

101

100

=*inicio

elem

4

e

4

-1 1010

3 1000

7 NULL

100

1000

1010

1. Gestionar espacio para almacenar un nuevo nodo.

nuevo

*nuevo 110

110

UNIDAD 8

Agregar en lista no vacía

RAM

inicio

ini 101

101

100

=*inicio

elem

4

e

4

-1 1010

3 1000

7 NULL

100

1000

1010

nuevo

*nuevo 110

110

1. Gestionar espacio para almacenar un nuevo nodo.

2. Asignar valores al nuevo nodo.

4 100

UNIDAD 8

Agregar en lista no vacía

RAM

inicio

ini 101

101

100

=*inicio

elem

4

e

4

-1 1010

3 1000

7 NULL

100

1000

1010

nuevo

*nuevo 110

110

4 100

1. Gestionar espacio para almacenar un nuevo nodo.

2. Asignar valores al nuevo nodo.

3. Actualizar el inicio de la lista.

110

UNIDAD 8 Lista Enlazada: Agregar al incio

UNIDAD 8 Lista Enlazada Simple: Agregar

Al inicio de la lista. INSERCION

Ordenada

Desordenada

Al final de la lista.

Antes de un elemento.

Después de un elemento.

UNIDAD 8 Agregar al Final

Deseamos insertar, al final de la lista, el elemento llamado elem. Es posible que la variable ini sea modificada.

main(){

NODO* ini;

scanf(«%i»,&elem);

agregar(& ini, elem);

}

El modulo agregar tiene dos parámetros:

El inicio de la lista, que recibe la dirección de ini y puede ser modificado: NODO* *inicio;

El elemento a insertar: int e;

UNIDAD 8 Agregar al Final: Casos

UNIDAD 8 Agregar al Final

UNIDAD 8 Lista Enlazada Simple: Agregar

Al inicio de la lista. INSERCION

Ordenada

Desordenada

Al final de la lista.

Antes de un elemento.

Después de un elemento.

UNIDAD 8 Agregar Ordenado

Deseamos insertar el elemento llamado elem en la lista enlazada de manera ordenada. La variable ini podrá ser modificada.

main(){

NODO* ini;

scanf(«%i»,&elem);

agregar(&ini, elem);

}

El modulo agregar tiene dos parámetros:

El inicio de la lista, que recibe la dirección de ini y será modificado: NODO* *inicio;

El elemento a insertar: int e;

UNIDAD 8 Agregar Ordenado: Casos

UNIDAD 8 Agregar Ordenado: Casos

NULL i ant

UNIDAD 8 Agregar Ordenado: Casos

i ant

UNIDAD 8 Agregar Ordenado: Casos

i ant

UNIDAD 8 Agregar Ordenado: Casos

NULL

i ant

UNIDAD 8 Agregar Ordenado: Casos

UNIDAD 8 Agregar Ordenado: Casos

UNIDAD 8 Agregar Ordenado

UNIDAD 8 Lista Enlazada: Mostrar

Deseamos mostrar los elementos de la lista enlazada, por lo que se recorre la lista partiendo del inicio indicado por ini.

main(){

NODO* ini;

mostrar( ini);

}

El modulo mostrar tiene un parámetro:

El inicio de la lista, que recibe la dirección de ini: NODO* inicio;

UNIDAD 8 Mostrar la lista

i

i = inicio;

Si (i != NULL) printf (“%i”, i->dato);

ó

Si (i != NULL) printf (“%i”, (* i). dato);

UNIDAD 8 Mostrar la lista

i

i=i->sgte;

printf (“%i”, i->dato);

Ó

i=(*i).sgte;

printf (“%i”, (* i). dato);

UNIDAD 8 Mostrar la lista

i

i=i->sgte;

printf (“%i”, i->dato);

Ó

i=(*i).sgte;

printf (“%i”, (* i). dato);

UNIDAD 8 Mostrar la lista

NULL

i

i es NULL , fin de la lista !!

UNIDAD 8 Lista Enlazada: Mostrar

RAM

inicio

ini 101

110

=*inicio

-1 1010

3 1000

7 NULL

100

1000

1010

110

4 100 110

1. Ubicarse al inicio de la lista.

i

110

UNIDAD 8 Lista Enlazada: Mostrar

RAM

inicio

ini 101

110

=*inicio

-1 1010

3 1000

7 NULL

100

1000

1010

110

4 100 110

1. Ubicarse al inicio de la lista.

2. Recorrer la lista, mostrando sus elementos, hasta el final.

i 110

100

1010

1000 NULL

Mostrar 4

Mostrar -1

Mostrar 3

Mostrar 7

UNIDAD 8 Lista Enlazada: Mostrar

UNIDAD 8 Lista Enlazada: Eliminar

Deseamos eliminar un elemento llamado elem de la lista enlazada. Es posible que la variable ini sea modificada.

main(){

NODO* ini;

scanf(«%i»,&elem);

eliminar(& ini, elem);

}

El modulo eliminar tiene dos parámetros:

La dirección del inicio de la lista, que podrá ser modificada: NODO* *inicio;

El elemento a eliminar: int e;

UNIDAD 8 Eliminar: Casos

NULL

UNIDAD 8 Eliminar: Casos

UNIDAD 8 Lista Enlazada: Eliminar