Вы находитесь на странице: 1из 14

Algoritmos y Estructuras de Datos 3. Estructuras de Datos Bsicas 3.1.

Conceptos Generales Manejo de datos Los datos son costosos, por esto deben ser manejados de tal manera que sean correctos y estn disponibles para producir informacin. Aspectos a considerar en el manejo de datos: 1. Medicin 2. Coleccin 3. Transcripcin 4. Validacin 5. Organizacin 6. Almacenamiento 7. Agregacin 8. Actualizacin 9. Recuperacin 10. Proteccin

El objetivo de un sistema de manejo de datos es hacer que estos sean adaptables y flexibles para apoyar el proceso de toma de decisiones de una organizacin. Cuatro sugerencias tiles para un sistema de administracin de datos son: Los datos deben representarse y almacenarse en cierta forma para accesarlos posteriormente. Los datos deben organizarse de manera adecuada para accesarlos selectiva y eficientemente. Los datos deben procesarse y presentarse de tal manera que puedan apoyar eficientemente al usuario. Los datos deben protegerse y manejarse para que no pierdan su valor.

Estructura de datos Es una clase de datos que se puede caracterizar por su organizacin y operaciones definidas sobre ella. Tambin se puede llamar tipo de dato. En un programa cada variable pertenece a alguna estructura de datos explcita o implcitamente definida, la cual determina el conjunto de operaciones vlidas para ella. Las estructuras de datos lgica puede tener varias representaciones fsicas diferentes, es decir, varias estructuras de almacenamiento. Estructuras primitivas : son aquellas que no estn compuestas por otras estructuras de datos. Ej. entero, booleano, caracter. Estructuras simples: son estructuras que se construyen a partir de estructuras primitivas. Ej. arreglo, estructura. Estructuras lineales: es una estructura de datos compleja, es decir, formada por estructuras simples. En esta estructura para cada elemento hay un elemento siguiente. Ej. pila, filas, listas ligadas. Estructura de datos no lineales: tambin es una estructura de datos compleja pero en este caso los elementos estn representados por relaciones ms complejas. En este caso para cada elemento hay varios elementos siguientes, por eso es que se llaman estructuras de ramificacin. Ej. grafo, rbol.

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

Estructuras primitivas y simples Entero : Es un elemento del siguiente conjunto: {. . . , -(n-1), -n, ..., -2, -1, 0, 1, 2, ..., n, (n+1), ...} Ej. Declaracin en Lenguaje C: int suma; Las operaciones fundamentales sobre los enteros son: suma, resta, multiplicacin, divisin y otras. Booleano : tambin llamado lgico. Es un dato que puede tener uno de dos valores: verdadero o falso. Los operadores booleanos son la negacin (not), la conjuncin (and) y la disyuncin (or). Ej. Declaracin en Lenguaje C: bool resp; Caracter: Un carcter es un elemento tomado de un conjunto de smbolos. Por ejemplo el conjunto: {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,...,X,Y,Z,?, *, +,#,...} Este conjunto contiene dgitos, letras del alfabeto y caracteres especiales. Ej. Declaracin en Lenguaje C: char letra; Arreglo: Un arreglo es un conjunto finito ordenado de elementos homogneos. Es ordenado porque se puede identificar el primero, el segundo, etc. y es homogneo porque todos los elementos son del mismo tipo. Existen arreglos unidimensionales, bidimensionales, tridimensionales,..., multidemsionales. Ej. Declaracin en Lenguaje C: char nombre[20]; char dos_dimens [10] [30]; int telefono[10]; Estructura : Es una coleccin finita y ordenada de elementos, posiblemente heterogneos, que se tratan como una unidad. Los elementos de una estructura son llamados miembros. Un miembro es un rea especfica de una estructura utilizada para una clase particular de informacin. Ej. Declaracin en Lenguaje C struct persona { int num_cta; char nombre[20]; }; Ej. Declaracin de una instancia cliente que es de tipo persona: struct persona cliente; Ej: Referencia a un miembro de la estructura cliente: cliente.num_cta = 10; Ej: Arreglos de estructuras. struct persona clientes[20]; clientes[i].id = 30;

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

3.2. Listas Introduccin Una lista enlazada o encadenada es una coleccin de elementos nodos, en donde cada uno contiene datos y un enlace o liga. Un nodo es una secuencia de caracteres en memoria dividida en campos (de cualquier tipo). Un nodo siempre contiene la direccin de memoria del siguiente nodo de informacin si este existe. Un apuntador es la direccin de memoria de un nodo La figura siguiente muestra la estructura de un nodo:
DATO LINK

El campo liga, que es de tipo puntero, es el que se usa para establecer la liga con el siguiente nodo de la lista. Si el nodo fuera el ltimo, este campo recibe como valor NIL (vaco). A continuacin se muestra el esquema de una lista : Juan Luis Mara Sofa
NULL

Forma de declarar una lista enlazada struct nodo { char dato[10]; struct nodo *link; }; struct nodo *lista; /* lista es un puntero a nodo*/ Ej. Referenciar un miembro de nodo: lista->dato =hola; lista->link = NULL; */ lista est apuntando a vaco*/ Inicializacin y Borrado de variables de tipo Puntero Cuando se quiere usar una variable tipo puntero no basta slo con declararla, es necesario asignarle un espacio en memoria. La funcion new, asigna almacenamiento para una variable de un tipo determinado y guarda la direccin de la celda de memoria en la variable. Ej. Asignacin de memoria para un nodo: lista = new nodo; Por otro lado, cuando la variable se deja de usar, se debe liberar la posicin de memoria ocupada por la variable, para ello se utiliza el procedimiento delete. Ej. Libera la posicin de memoria ocupada por un nodo: delete lista; Operaciones en Listas Encadenadas Las operaciones que podemos realizar sobre listas encadenadas son las siguientes:
Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera Mariella Gutirrez Valenzuela Docente rea Informtica

Recorrido. Esta operacin consiste en visitar cada uno de los nodos que forman la lista. Para recorrer todos los nodos de la lista, se comienza con el primero, se toma el valor del campo liga para avanzar al segundo nodo, el campo liga de este nodo nos dar la direccin del tercer nodo, y as sucesivamente. Insercin. Esta operacin consiste en agregar un nue vo nodo a la lista. Para esta operacin se pueden considerar tres casos: o Insertar un nodo al inicio. o Insertar un nodo antes o despus de cierto nodo. o Insertar un nodo al final. Borrado. La operacin de borrado consiste en quitar un nodo de la lista, redefiniendo las ligas que correspondan. Se pueden presentar cuatro casos: o Eliminar el primer nodo. o Eliminar el ltimo nodo. o Eliminar un nodo con cierta informacin. o Eliminar el nodo anterior o posterior al nodo cierta con informacin. Bsqueda. Esta operacin consiste en visitar cada uno de los nodos, tomando al campo liga como puntero al siguiente nodo a visitar.

Algoritmos sobre listas lineales Las listas lineales encadenadas siempre deben mantener un puntero al inicio el cual se llama raiz o tope. Se usar la variable TOP para referenciar al primer nodo de la lista y TOP->dato y TOP->link para hacer referencia al dato almacenado y al link al siguiente nodo respectivamente. struct nodo { char dato; struct nodo *link; }; Algoritmo de Creacin
struct nodo *Crea_lista_final()/*donde p es de tipo puntero a nodo}*/ { struct nodo *p, *top, *q; /*top es un puntero al inicio de la lista de nodos*/ int respuesta; /*q es de tipo puntero a nodo*/ TOP = NULL; respuesta = 1; while (respuesta) { p = new nodo; cout << Dato; cin >> p->dato; if (top == NULL) { top = p; q = p;} else { q->link = p; p->link = NULL; q = p; } cout << Otro nodo? (si=1; no=0); cin >> respuesta; } return(top); }

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

struct nodo *Crea_lista_inicio()/*donde p es de tipo puntero a nodo}*/ { struct nodo *top; /*top es un puntero al inicio de la lista de nodos*/ int respuesta; top = NULL; respuesta = 1; while (respuesta) { p = new nodo; cout << Dato; cin >> p->dato; if (top == NULL) top = p; else { p->link = top; top = p;} cout << Otro nodo? (si=1; no=0); cin >> respuesta; } return(top); }

Algoritmo para Recorrido


Recorre_lista(struct nodo *top) /*top es un puntero al inicio de una lista*/ { struct nodo *p; p = top; while (p <> NULL) { cout << p->dato; p = p->link;} }

Algoritmo para insertar un nodo a una lista que ya existe y que est apuntada por top
inserta_final_lista(struct nodo *top) { struct nodo *p, *q; p = top; while (p->link <> NULL) p = p->link; q = new nodo; cout << Dato; cin >> q->dato; p->link = q; q->link = NULL; } inserta_inicio_lista(top) { struct nodo *p; p = new nodo; cout << Dato; cin >> p->dato; p->link = top; top = p; }

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

Algoritmo para insertar un nodo antes/despus de 'X' informacin


Inserta_antes_despues(struct nodo *top, char x) { struct nodo *p, *q; int respuesta; p = top; cout << antes(1)/despus(0)) cin >> respuesta; if (respuesta) { while (p <> NULL) { if (p->dato == x) { q = new nodo; cout << Dato; cin >> q->dato; q->link = p; if (p == top) top = q; else r->link = q; }else { r = p; p = p->link;} } }else { while (p <> NULL) { if (p->dato == x) { q = new nodo; cout << Dato; cin >> q->dato; if (p == top || p->link==NULL) { p->link = q; q->link = NULL;} else { q->link = p->link; p->link = q;} }else p = p->link; } } }

Algoritmo para borrar un nodo que tiene el dato X


elimina_nodo (struct nodo *top, char x) { struct nodo *p, *q; p = top; while (p <> NULL) { if(p->dato == x) if (p == top) if (p->link == NULL) top = NULL; else top = top->link; else q->link = p->link; delete p; else { q = p; p = p->link;} } } Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera Mariella Gutirrez Valenzuela Docente rea Informtica

Listas Circulares Las listas circulares tienen la caracterstica de que el ltimo elemento de la lista apunta al primero. La siguiente figura es una representacin grfica de una lista circular. Juan Luis Mara Sofa

Algunos algoritmos sobre listas circulares son: Algoritmo de creacin


struct nodo *Crea_lista_circular_final()/*donde p es de tipo puntero a nodo}*/ { struct nodo *p, *top, *q; /*top es un puntero al inicio de la lista de nodos*/ int respuesta; /*q es de tipo puntero a nodo*/ top = NULL; respuesta = 1; while (respuesta) { p = new nodo; cout << Dato; cin >> p->dato; if (top == NULL) { top = p; q = p;} else { q->link = p; q = p; } p->link = top; cout << Otro nodo? (si=1; no=0); cin >> respuesta; } return(top); }

Algoritmo para recorrer la lista


Recorre_circular(struct nodo *top) { struct nodo *p; p = top; if (p <> NULL) { cout << p->dato; p = p->link;} while (p <> top && p <> NULL) { cout << p->dato; p = p->link;} }

Algoritmo para borrar un nodo que contiene la informacin X


Elimina_circular(struct nodo *top, char x) { struct nodo *p, *q, *r; q = top; r = top; p = top; while (q->link <> top) /*posiciona el puntero q al final de la lista*/ q = q->link; do { if (p->dato == x) Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera Mariella Gutirrez Valenzuela Docente rea Informtica

if (p == top) if (top->link=top) top = NULL; else { top = top->link; q->link = top;} else r->link = p->link; delete p; p = top; } else { r = p; p = p->link;}

} while (p <> top); }

Listas doblemente encadenadas Una lista doble, o doblemente ligada es una coleccin de nodos en la cual cada nodo tiene dos punteros, uno de ellos apuntando a su predecesor (Ant) y otro a su sucesor (Sig). Por medio de estos punteros se podr avanzar o retroceder a travs de la lista, segn se tomen las direcciones de uno u otro puntero. En estas listas cada nodo conoce quien es el siguiente nodo y quien es el anterior.
NODO

Ant Dato Sig

Donde Ant y Sig son punteros a NODO.


TOP NULL

NULL

FIN

Dado que las listas doblemente encadenadas se pueden recorrer de izquierda a derecha y vise versa Es necesario mantener dos punteros indicando los extremos de la lista, el puntero TOP al inicio y el puntero FIN al trmino. Existen dos tipos de listas doblemente ligadas: Listas dobles lineales. En este tipo de lista doble, tanto el puntero izquierdo del primer nodo como el derecho del ltimo nodo apuntan a NULL. Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del primer nodo apunta al ltimo nodo de la lista, y el puntero derecho del ltimo nodo apunta al primer nodo de la lista.

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

Procedimiento de crear el primer nodo de una lista doblemente enlazada


p1 1. 2. 3. 4. 5. 6. p =new nodo p->dato= INFO p->sig = NULL p->ant = NULL TOP = p FIN = p TOP5 NULL3

INFO2

NIL4

FIN6

Procedimiento para insertar un nodo al comienzo


1. 2. 3. 4. 5. 6. p = new nodo p->dato= INFO p->sig = TOP p->ant = NULL TOP->ant = p TOP = p

Procedimiento para insertar despus de un nodo de referencia Se recorre la lista hasta encontrar el nodo de referencia, que queda apuntado por q
1. 2. 3. 4. 5. 6. p = new nodo; p->dato = INFO p->sig = q->sig p->ant = q q->sig->ant = p q->sig = p

Procedimiento para insertar antes de un nodo de referencia Se recorre la lista hasta encontrar el nodo de referenc ia, que queda apuntado por q
1. 2. 3. 4. 5. 6. p = new nodo p->dato = INFO p->sig = q p->ant = q->ant q->ant->sig = p q->ant = p

Algoritmo de creacin de lista dobles circulares


top = NULL repite p= new nodo lee(p->dato) si top=NULL entonces p->sig = p p->ant = p top = p en caso contrario p->sig = top p->ant = top->ant top->ant = p p->ant->sig = p top = p mensaje(otro nodo?) lee (respuesta) hasta respuesta=no

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

Algoritmo para recorrer la lista

Recorrido a la Derecha

Recorrido a la Izquierda

P = top repite escribe(p->dato) p = p->sig hasta p = top->ant

P = top repite escribe(p->dato) p = p->ant hasta p = top->sig

Algoritmo para insertar


Antes de x p = top lee(x) repite si p->dato = x entonces q = new nodo leer(q->dato) si p = top entonces top = q q->sig = p q->ant = p->ant p->sig->ant = q p->ant = q p = top en caso contrario p = p->sig hasta p = top Despus de x p = top lee(x) repite si p->dato = x entonces q = new nodo leer(q->dato) q->sig = p->sig q->ant = p p->sig->ant = q p->sig = q p = top en caso contrario p = p->sig hasta p=top

Algoritmo para borrar un nodo


p = top lee(valor_a_borrar) repite si p->dato = valor_a_borrar entonces p->sig->ant = p->ant p->ant->sig = p->sig si p = top entonces si p->sig = p->ant entonces top = NULL en caso contrario top = top->sig dispose(p) p = top en caso contrario p = p->sig hasta p = top

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

3.3. Tipo de Dato Abstracto Pila (Stack) Las pilas son otro tipo de estructura de datos lineales, las cuales presentan restricciones en cuanto a la posicin en la cual pueden realizarse las inserciones y las extracciones de elementos. Una pila es una lista de elementos en la que se pueden insertar y eliminar elementos slo por uno de los extremos. Como consecuencia, los elementos de una pila sern eliminados en orden inverso al que se insertaron. Es decir, el ltimo elemento que se meti a la pila ser el primero en salir de ella. En la vida cotidiana existen muchos ejemplos de pilas, una pila de platos en una alacena, una pila de latas en un supermercado, una pila de papeles sobre un escritorio, golosinas en una mquina de ventas automticas, etc. Debido al orden en que se insertan y eliminan los elementos en una pila, tambin se le conoce como estructura LIFO (Last In, First Out: ltimo en entrar, primero en salir). Representacin en Memoria Las pilas no son estructuras de datos fundamentales, es decir, no estn definidas como tales en los lenguajes de programacin. Las pilas pueden representarse mediante el uso de: Arreglos. Listas enlazadas.

Pilas representadas mediante Arreglos

Se debe definir el tamao mximo de la pila, adems de un apuntador (SP: entero) que indica la cima de la pila, es decir, dnde se debe insertar el prximo elemento. La representacin grfica de una pila es la siguiente: Arreglo : tamao mximo n=5

SP=2 DATO1 Al utilizar arreglos para implementar pilas, tenemos la limitante de espacio de memoria reservada. Una vez establecido un mximo de capacidad para la pila, ya no es posible insertar ms elementos. Una posible solucin a este problema es el uso de espacios compartidos de memoria. Supngase que se necesitan dos pilas, cada una con un tamao mximo de n elementos. En este caso se definir un solo arreglo de 2*n elementos, en lugar que dos arreglos de n elementos. En este caso utilizaremos dos apuntadores: SP1 para apuntar al ltimo elemento insertado en la pila 1 y SP2 para apuntar al ltimo elemento insertado en la pila 2. Cada una de las pilas insertar sus elementos por los extremos opuestos, es decir, la pila 1 iniciar a partir de la localidad 1 del arreglo y la pila 2 iniciar en la localidad 2n. De este modo si la pila 1 necesita ms de n espacios (hay que recordar

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

que a cada pila se le asignaron n localidades) y la pila 2 no tiene ocupados sus n lugares, entonces se podrn seguir insertando elementos en la pila 1 sin caer en un error de desbordamiento. Inicialmente SP debe estar en un extremo del arreglo, existen dos formas de implementar el arreglo: creciente hacia abajo o creciente hacia arriba. 1 2 . . n-2 n-1 n ///////////// ///////////// push pop 1 2 . . n-2 n-1 N

Creciente hacia abajo Pila vacia: sp = 1 Pila llena : sp = n+1

//////////////// //////////////// Creciente hacia arriba

push

pop

Pila vaca: sp = n Pila llena : sp = 0

Operaciones en Pilas Las principales operaciones que podemos realizar en una pila son:

Insertar un elemento (push). Eliminar un elemento (pop).

Los algoritmos para realizar cada una de estas operaciones se muestran a continuacin. La variable mximo para hacer referencia al mximo nmero de elementos en la pila. Insercin (Push) si sp = mximo entonces mensaje (overflow) en caso contrario sp = sp+1 pila[sp] = valor Eliminacin (Pop) si sp = 0 entonces mensaje (underflow) en caso contrario x = pila[sp] sp = sp-1

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

3.4. Tipo de Dato Abstracto Cola Las colas son otro tipo de estruc tura de datos lineales, las cuales presentan restricciones en cuanto a la posicin en la cual pueden realizarse las inserciones y las extracciones de elementos. Una cola es una lista de elementos en la que se insertan elementos por un extremo y se eliminan elementos por el extremo opuesto. Como consecuencia, los elementos de una cola sern eliminados en el mismo orden en que se insertaron. Es decir, el primer elemento que se meti a la cola ser el primero en salir de ella. En la vida cotidiana existen muc hos ejemplos de colas, una cola para pagar cuentas en el banco, una cola de llamadas telefnicas en una central, una cola de impresin, etc. Debido al orden en que se insertan y eliminan los elementos en una cola, tambin se le conoce como estructura FIFO (First In, First Out: primero en entrar, primero en salir). Operaciones en Colas Las principales operaciones que podemos realizar en una cola son: Insertar un elemento (in). Extraer un elemento (out). Representacin en Memoria Las colas no son estruc turas de datos fundamentales, es decir, no estn definidas como tales en los lenguajes de programacin. Las colas pueden representarse mediante el uso de : Arreglos. Listas enlazadas.

Representacin de colas mediante Arreglos

Existen tres mtodos diferentes para representar una cola mediante arreglos: Primer Mtodo : Se define un arreglo de tamao mximo y un apuntador al inicio de la cola (primer elemento) y uno al final de la cola (prximo espacio libre). Cada vez que se inserta un nuevo elemento se incrementa el apuntador del final hasta que se llega al tamao mximo ms uno. Cada vez que se extrae un elemento el apuntador al inicio debe disminuir en uno hasta que inicio es igual a final. La representacin grfica de una cola es la siguiente: Arreglo : tamao mximo 5 1 A 2 B 3 4 5
Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

inicio =1 fin = 3

Mariella Gutirrez Valenzuela Docente rea Informtica

El problema con este tipo de representacin es que si se inserta el tamao mximo de elementos del arreglo, no se podr seguir insertando aunque se hayan extrado elementos. Ejemplo: Realice en forma grfica la siguiente secuencia de operaciones: in(A), in(B), in(C), out(A), in(D), out(B), out(C), in(E), in(F). Registre cada vez los valores de inicio y fin. La cola est vaca si inicio = 0 o fin = 1 y la cola est llena si fin = tam_max + 1 El esta representacin tanto la insercin de elementos como la eliminacin son de O(1). Segundo Mtodo : Una forma de solucionar este problema es desplazar los datos hacia arriba cada vez que se extrae un elemento. De esta forma el dato a extraer siempre estar en la primera posicin del arreglo. Ejemplo: Realice en forma grfica la siguiente secuencia de operaciones: in(A), in(B), in(C), out(A), in(D), out(B), out(C), in(E), in(F). Registre cada vez los valores de inicio y fin. El problema que surge con este mtodo es que la insercin es de O(1) y la extraccin se incrementa a O(n) por tener que hacer los corrimientos. Tercer Mtodo : Este mtodo consiste en implementar la cola utilizando un buffer circular, en este caso tanto la insercin como la extraccin de elementos se mantienen de O(1). El apuntador inicio siempre est en la posicin donde se debe extraer el prximo elemento y el apuntador fin estar en la posicin donde se debe insertar el prximo elemento, Si fin est en la posicin del tamao mximo del arreglo debe ser inicializado en el primer elemento del arreglo de manera de continuar circularmente, esto siempre y cuando inicio no sea igual al primer elemento, en cuyo caso la cola estar llena. Inicio debe ser incrementado cada vez que se extrae un elemento e inicializado en la primera posicin del arreglo cuando se extraiga elemento de la ltima posicin del arreglo, esto siempre y cuando inicio sea distinto de fin en cuyo caso la cola estar vaca. El problema con esta representacin es que la condicin inicio = fin se aplica tanto para la cola llena como para la cola vaca. Para solucionar esto se utiliza una variable para almacenar el nmero de elementos de la cola. Si la variable es igual a cero la cola est vaca, cuando la variable es igual al tamao mximo del arreglo la cola est llena.

Universidad Catlica de la Santsima Concepcin Facultad de Ingeniera

Mariella Gutirrez Valenzuela Docente rea Informtica

Вам также может понравиться