Está en la página 1de 15

Diseo de Algoritmos. E.U.Politcnica. I.T.

Industrial (Electricidad)

Tema 4. Estructuras Dinmicas


Diseo de Algoritmos.
E.U. Politcnica Departamento Lenguajes y Ciencias de la Computacin. Universidad de Mlaga Jos Luis Leiva Olivencia. Despacho: I-326D (Edificio E.U.P)/ 3.2.41 (Teatinos-E.T.S.I.I.)

Diseo de Algoritmos

Elementos Diseo de Programacin de Algoritmos. I

Introduccin a las Estructuras de Datos Dinmicas


Variables estticas:
Se conoce su nombre. Se conoce cuando empieza/acaba su existencia. Se conoce el espacio que ocupan en memoria.

Diseo de Algoritmos.

Introduccin a las Estructuras de Datos Dinmicas


Problema Que sucede si a priori no conocemos la cantidad de espacio de almacenamiento que vamos a precisar? Solucin Hacer una previsin??

Ejemplo: Tipos Struct persona {char nombre[30]; int edad;} Variables Struct persona poblacion[30];

Diseo de Algoritmos.

Introduccin a las Estructuras de Datos Dinmicas


Variables annimas:
No se conoce su nombre. No se conoce el momento en que empieza/acaba su existencia. El espacio que van a ocupar en memoria es variable.

Diseo de Algoritmos.

PUNTEROS
Que Es un Puntero? Variable Esttica Un puntero es una variable que almacena una direccin de memoria

Diseo de Algoritmos.

Declaracin de Punteros
Tipos typedef int *ptrint; /*puntero a enteros*/ Variables ptrint p; /*puntero a enteros*/ Variables int *p; /*puntero a enteros*/

1 FORMA

2 FORMA

Diseo de Algoritmos.

Declaracin de Punteros
Typedef struct { int num; char car; } tiporegistro ; Typedef tiporegistro *tipopuntero; Tipopuntero p;
As: p es la direccin de un registro con dos campos. (tipo puntero) *p es un registro con dos campos (tipo registro) (*p).num es una variable simple (tipo entero) p->num es una variable simple (tipo entero) &x es la direccion de una variable x, siendo x, por ejemplo int x; Si deseamos que una variable tipo puntero no apunte a nada, asignamos la palabra reservada NULL (p=NULL)

Diseo de Algoritmos.

Variables Annimas
Variables int *ptr;
*ptr=100;

MEMORIA ptr 23423 23419 234343 23420 324237 23421 28 23422 100 23423
Variable Annima

Direccin de memoria

Contenido de la memoria

Diseo de Algoritmos.

Representacin Grfica de las Variables Puntero


Direccin 23419 ptr 23423 1 Forma Direccin 23423 Variable Annima 100

ptr 100 2 Forma


Diseo de Algoritmos.

Punteros y Creacin de Variables Dinmicas


Inicializacin de Punteros:
Int *ptr; ptr = NULL
ptr

Creacin de una Variable Annima:


ptr ptr=(int *)malloc(sizeof(int));
(Si no ex existiera memoria libre, devuelve un puntero NULL)

??

Destruccin de una Variable Annima:


free(ptr);
ptr
Diseo de Algoritmos.

Punteros y Creacin de Variables Dinmicas


typedef tiporegistro *tipopuntero; tipopuntero p; if ((p=(tiporegistro*)malloc(sizeof(tiporegistro))==NULL) {printf(No hay memoria); exit(1); }
Diseo de Algoritmos.

Operaciones con Punteros


Dereferenciacin: ptr->PartReal Comparacin: ptr1 == ptr2 Asignacin: ptr1 = ptr2
Ejemplo: typedef struct { float partereal,partecompleja;} partescomplejas; typedef partescomplejas *complejo; complejo punt1,punt2; punt1->partereal=5.0; punt1->partcompleja=1.2: punt2=punt1;
Diseo de Algoritmos.

Operaciones sobre Listas Enlazadas


INICIALIZACION
Correcto
lista = NULL

lista

Errneo

lista
lista=malloc(.) lista =NULL

?? lista ??
Diseo de Algoritmos.

Declaracin de listas en C
#include <stdlib.h> typedef struct nodo { int dato; struct nodo *sig; } tlista; tlista *primero;

Diseo de Algoritmos.

Visualizar una Lista


visualizaLista(Tlista *lista) { Tlista *recorrer; recorrer = lista WHILE recorrer != NULL { Escribir(recorrer->dato); recorrer = recorrer->sig } }

Diseo de Algoritmos.

Operaciones bsicas sobre listas enlazadas.


Suponiendo: typedef struct nodo { int dato; struct nodo *sig; } tiponodo; typedef tiponodo *tipolista; tipolista lista; /*cabeza de la lista*/ tipolista nodo; /*nuevo nodo a insertar*/ tipolista ptr; /*puntero auxiliar*/
Diseo de Algoritmos.

Insertar un Nodo al Principio


Suponiendo:
lista
3 2 9

1.- ptr=malloc(sizeof(tiponodo));
ptr
?? ??

Diseo de Algoritmos.

Insertar un Nodo al Principio


2.- ptr->dato= 5
ptr
5 ??

3.- ptr->sig= lista


lista
3 2 9

ptr
5

Diseo de Algoritmos.

Insertar un Nodo al Principio


4.- lista= ptr
lista
3 2 9

ptr
5

Diseo de Algoritmos.

Eliminar el Primer Nodo


Suponiendo:
lista
3 2 9

1.- ptr = lista


lista
3 2 9

ptr Diseo de Algoritmos.

Eliminar el Primer Nodo


2.- lista = lista->sig;
lista
3 2 9

ptr

3.- free(ptr);
lista
2 9

ptr Diseo de Algoritmos.

Insertar un Nodo en una Lista Enlazada Ordenada


Partimos de la lista:
lista
2 9 19

Queremos insertar el nmero: 15

1.nuevonodo=malloc(sizeof(tiponodo))
nuevoNodo
?? ??

Diseo de Algoritmos.

Insertar un Nodo en una Lista Enlazada Ordenada


2.- nuevoNodo->dato = 15 nuevoNodo->sig = NULL
nuevoNodo
15

3.- Algoritmo que inserta el nodo en la posicin correcta.

Diseo de Algoritmos.

Insertar un Nodo en una Lista Enlazada Ordenada


Si la lista no est vaca utilizamos unm bucle similar al siguiente: while ((ptrsig!=NULL) && (nuevonodo dato > (ptrsig) dato))) ptr=ptrsig; Nodo sig=ptrsig; Ptrsig=nodo;
Diseo de Algoritmos.

Insertar un Nodo en una Lista Enlazada Ordenada


Grficamente:
lista
2 9 19

buscaPosicion

nuevoNodo
15

Diseo de Algoritmos.

Eliminar un Nodo de una Lista Enlazada


Suponiendo:
lista
2 6 9

Queremos borrar el nmero: 6 Supondremos que est en la lista.

1.- actual anterior


lista
2

= lista = NULL

actual

anterior

Diseo de Algoritmos.

Eliminar un Nodo de una Lista Enlazada


2.- Bsqueda del nodo a borrar.
while (actual->dato != dato) { anterior = actual; actual= actual->sig; }

lista
2 6 9

anterior

actual

Diseo de Algoritmos.

Eliminar un Nodo de una Lista Enlazada


3.- Actualizar los punteros
if (anterior ==NULL) lista = lista->sig else anterior->sig = actual->sig

actual

lista
2 9

anterior

Diseo de Algoritmos.

Eliminar un Nodo de una Lista Enlazada


4.- free(actual);
actual

lista
2 9

anterior

Diseo de Algoritmos.