Vous êtes sur la page 1sur 25

Lenguaje de programacin C

Estructuras de datos

Datos
Los datos son una parte activa de las operaciones y planes de las organizaciones. Las decisiones se toman con base a la informacin que proporcionan los datos. A los resultados de las decisiones se les llama acciones, que producen datos que se pueden incorporar despus a otro ciclo del proceso de toma de decisiones. Las decisiones pueden ser operacionales, de control o de planificacin. Los mismos elementos de datos pueden participar en la produccin de informacin para apoyar a los tres niveles de toma de decisiones. Los datos se deben estructurar correctamente para que sean accesibles y que sirvan como respuesta a las posibles preguntas. Los datos deben ser manejados de tal manera que sean correctos y estn disponibles para producir informacin.

Estructura de datos
Una estructura de datos es una clase de datos que se puede caracterizar por su organizacin y operaciones definidas sobre ella. 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. Cada estructura de datos puede tener varias representaciones fsicas diferentes para sus almacenamientos posibles. Para cada estructura de datos que consideremos, se introducirn varias formas posibles de almacenamiento. Estructuras primitivas y simples. Las estructuras de datos primitivas no estn compuestas por otras estructuras: enteros, booleanos y caracteres. Las estructuras de datos simples se construyen a partir de estructuras primitivas: cadenas, matrices y registros. Las estructuras de datos simples se pueden combinar de varias maneras para formar estructuras ms complejas. Las estructuras de datos complejas pueden ser lineales y nolineales, dependiendo de las complejidad de las relaciones lgicas que representan. Las estructuras de datos lineales incluyen listas, pilas y colas. Las estructuras de datos no lineales incluyen los rboles, grafos y montculos. Muchos lenguajes de programacin ofrecen al programador un conjunto predefinido de estructuras de datos. En otros, el programador puede definir sus propias estructuras (por ejemplo en Pascal con el enunciado type y en Lenguaje C con el enunciado struct. Una de las diferencias ms notables entre estructuras de datos proporcionadas por el lenguaje y definidas por el programados, es la validacin de las operaciones sobre las estructuras de datos.
4

Estructuras de datos simples


Las cadenas son secuencias finitas de smbolos tomados de un conjunto de caracteres. El conjunto de caracteres que se emplea para generar cadenas se llama alfabeto. Al conjunto de todas las posibles cadenas que se pueden derivar de un alfabeto se le llama vocabulario. Sobre las cadenas se pueden efectuar operaciones de concatenacin, subcadenas, insercin, Los caracteres se pueden almacenar segn distintos esquemas de codificacin: EBCDIC, ASCII, Una alternativa para el almacenamiento de cadenas son espacios contiguos. Una cadena de longitud N requiere fsicamente espacio adyacente de N caracteres.
Las cadenas CD o 1D11 se pueden derivar del alfabeto A={C,D,1}

Las matrices son un conjunto finito ordenado de elementos homogneos. Los elementos de una matriz son referenciados segn sus posiciones. Las matrices pueden se unidimensionales y multidimensionales. Se pueden efectuar operaciones sobre los elementos individuales o sobre la matriz. Los registros son colecciones finitas y ordenas de elementos, posiblemente heterogneos, que se tratan como una unidad (en C se denominan estructuras). Los campos son reas especficas de un registro. Los elementos del registro se pueden referenciar de forma individual en un programa. Los registros son importantes porque pueden preservar la estructura lgica natural de los elementos de informacin relacionados.
5

Estructuras de datos complejas


Una lista lineal es una estructura de datos formada por un conjunto de elementos ordenados, el nmero de elementos de la lista puede variar.
A=[A1, A2, AT] Si T=0 entonces A se dice que es una lista vaca o nula.

Se puede borrar un elemento o insertar en cualquier posicin de la lista. As la lista puede crecer o decrecer al transcurrir el tiempo. Una pila es un caso especial de una lista lineal en el cual, la insercin o supresin son operaciones que slo pueden ocurrir en un extremos de la pila, el cual se denomina como tope de la pila. Existen cuatro operaciones bsicas que son vlidas para el tipo de datos pila: crear, pila_vaca, insertar y sacar. Las pilas pueden emplearse en la solucin de problemas que necesitan de una estructura de datos tipo ltimo-que-entra-primero-que-sale. Una cola es un caso especial de una lista lineal en el cual, la insercin se hace estrictamente por un extremos de la lista, al cual podemos llamar fondo, la supresin slo puede hacerse por el otro extremo de la lista, al cual llamamos frente. Existen cuatro operaciones bsicas que son vlidas para el tipo de datos cola: crear, cola_vaca, insertar y sacar. Las colas se usan ampliamente en operaciones de computadoras, por ejemplo, en la seleccin del siguiente trabajo a atender, en la seleccin del siguiente archivo a imprimir en la impresora, Las estructuras de datos complejas se pueden almacenar como estructuras estticas (matrices) o dinmicas.
6

Estructuras estticas vs. dinmicas


Estructuras estticas. Cuando se crea una matriz se fija su nmero de elementos y despus no puede agrandarse o disminuirse elemento a elemento, conservando el espacio asignado. En memoria, los elementos de una matriz se ubican uno a continuacin de otro. Estructuras dinmicas. Pueden variar su tamao. Se realiza una asignacin dinmica para los elementos individuales, al tiempo que son creados durante la ejecucin del programa, en vez de hacer la asignacin de una sola vez para un nmero de elementos determinado. El compilador asigna una cantidad fija de memoria para mantener la direccin del elemento asignado dinmicamente, en vez de hacer una asignacin para el elemento en s. En estructuras dinmicas el orden fsico de almacenamiento y el orden lgico no es necesariamente el mismo. Los elementos de una lista lineal, con estructura dinmica, no estn necesariamente consecutivos en memoria. Durante la ejecucin del programa pueden crecer o decrecer elemento a elemento segn las necesidades prevista en el mismo. Cmo pasamos de un elemento al siguientes cuando recorremos la lista? Cada elemento debe almacenar informacin de donde est el siguiente elemento o el anterior, o bien ambos.
7

Estructuras de datos

Estructuras de datos lineales: son aquellas estructuras de datos en que cada elemento tiene como mucho dos elementos adyacentes (posterior y/o anterior): pilas, colas o listas. Estructuras de datos no lineales: son aquellas estructuras de datos cuyos elementos pueden tener ms de dos elementos adyacentes, a los que puede acceder directamente: rboles, montculos o grafos.

Lista lineal
Una lista lineal es una estructura de datos formada por un conjunto de elementos ordenados, el nmero de elementos de la lista puede variar durante la ejecucin del programa segn las necesidades prevista en el mismo. Cada elemento debe almacenar informacin de donde est el siguiente elemento o el anterior, o bien ambos. En funcin de esta informacin las listas pueden clasificarse en: listas simplemente enlazadas, listas circulares, listas doblemente enlazadas y listas circulares doblemente enlazadas.
Lista lineal simplemente enlazada es una coleccin de objetos, cada uno de los cuales contiene datos o un puntero a los datos y un puntero al siguiente objeto en la coleccin.

El valor NULL, puntero nulo, permite crear listas de objetos finitas.

Listas lineales simplemente enlazadas


Lista lineal simplemente enlazada es una coleccin de objetos, cada uno de los cuales contiene datos o un puntero a los datos y un puntero al siguiente objeto en la coleccin.
La implementacin en Lenguaje C: typedef struct lista { //datos o un puntero a los datos. struct lista *siguiente; //puntero al siguiente elemento. } elemento_lista; La estructura elemento_lista definir una serie de miembros correspondientes a los datos que deseamos manipular. El miembro siguiente permite que cada elemento pueda apuntar a su sucesor formando as una lista enlazada.

Operaciones bsicas:
Insertar un elemento en una lista. Buscar un elemento en una lista. Borrar un elemento en una lista. Recorrer los elementos de una lista. Borrar todos los elementos de una lista.
10

Listas lineales simplemente enlazadas


Sea una lista lineal apuntada por p. para insertar un elemento al principio de la lista:
Crear el elemento apuntado por q.
lista_elemento *q=(lista_elemento *)malloc(sizeof(lista_elemento);

Reasignar los punteros.


q->siguiente=p; p=q;

Para insertar un elemento a continuacin de otro elemento cualquiera apuntado por r.


Crear el elemento apuntado por q. Reasignar los punteros.
q->siguiente=r->siguiente; r->siguiente=q;

Para insertar un elemento antes de otro elemento apuntado por r.


Crear el elemento apuntado por q. Reasignar los punteros.
*q=*r; r->dato=x; r->siguiente=q;
11

Listas lineales simplemente enlazadas


Para borrar el sucesor de un elemento apuntado por r.
Establecer un puntero q que apunte al elemento a borrar.
q=r->siguiente;

Enlazar los elementos anterior y posterior al borrardo


r->siguiente=q->siguiente;

Borrar el elemento apuntado por q.


free(q);

Para borrar un elemento apuntado por r.


Establecer un puntero q que apunte al elemento a borrar.
q=r->siguiente;

Copiar miembro a miembro un objeto en otro.


*r=*q;

Borrar el elemento apuntado por q.


free(q);

12

Listas lineales simplemente enlazadas


Recorrer una lista, cuyo primer elemento est apuntado por p.
Salvar el puntero al primer elemento de la lista.
q=p;

Recorrer, elemento a elemento, la lista.


while(q|=NULL) { //operacin en el elemento. q=q->siguiente; }

Borrar todos los elementos de una lista.


while(p|=NULL) { q=p; p=p->siguiente; free(q); }

Antes de borrar el elemento apuntado por q, hacemos que p apunte al siguiente elemento para no perder el resto de la lista.

13

Lista lineal
Lista circular es una coleccin de objetos, cada uno de los cuales contiene datos o un puntero a los datos y un puntero al siguiente objeto en la coleccin. El ltimo objeto apunta al primero. Es posible acceder a cualquier elemento de la lista desde cualquier punto dado.

En la lista doblemente enlazada cada elemento tiene informacin de dnde se encuentra el elemento posterior y el elemento anterior. Esto permite leer la lista en ambas direcciones. En la lista circular doblemente enlazada cada elemento tiene informacin de dnde se encuentra el elemento posterior y el elemento anterior. El ltimo objeto apunta al primero y el primero al ltimo.

14

Pilas (1)
Una pila es una secuencia de elementos en la cual el ltimo en entrar es el primero en salir (LIFO, last in first out). La insercin o supresin slo se efecta en el extremo libre de la pila. Ejemplo de implementacin como una lista enlazada en lenguaje C (slo se necesita un puntero extremo al principio de la pila).
typedef struct dato_pila { int dato; //puede ser el dato o un puntero al dato. struct dato_pila *anterior; } elemento_pila; typedef struct { elemento_pila *extremo;} Pila; void iniciar_pila (Pila *pila) //iniciar la pila poniendo extremo a NULL { pila->extremo=NULL; } int pila_vacia(Pila *pila) //comprueba si la pila est vaca. { if (pila->extremo==NULL) return(1); else return(0); }

15

Pilas (2)
int apilar (Pila *pila, int elemento) { //aadir elemento a la pila por el extremo. elemento_pila *nuevo; nuevo=(elemento_pila *)malloc(sizeof(elemento_pila)); nuevo->dato=elemento; nuevo->anterior=pila->extremo; pila->extremo=nuevo; int desapilar (Pila *pila) { //si la pila no est vaca, toma el elemento del extremo y libera memoria. elemento_pila *borrar; tipo_dato_cola x; if (pila_vacia(pila)==1) return(0); borrar = pila->extremo; x=(pila->extremo)->dato; pila_extremo=(pila->extremo)->anterior; free(borrar); return(x); }

16

Colas (1)
Una cola es una secuencia de elementos en la cual el primero en entrar es el primero en salir (FIFO, first in first out). La insercin se hace por un extremo de la lista (por el final) y la supresin se hace por el otro extremo de la lista (por el principio). Ejemplo de implementacin como una lista enlazada en lenguaje C:
typedef struct dato_cola { int dato; //puede ser el dato o un puntero al dato. struct dato_cola *siguiente; } elemento_cola; typedef struct { elemento_cola *inicio, *final;} Cola; void iniciar_cola (Cola *cola) //iniciar la cola poniendo inicio y final a NULL { cola->inicio=cola->final=NULL; } int cola_vacia(Cola *cola) //comprueba si la cola est vaca. { if (cola->inicio==NULL) return(1); else return(0); }
17

Colas (2)
int aadir_elemento_cola (Cola *cola, int elemento) { //aadir elemento: pedir memoria. elemento_cola *nuevo; nuevo=(elemento_cola *)malloc(sizeof(elemento_cola)); nuevo->dato=elemento; nuevo->siguiente=NULL; if (cola_vacia(cola)) { cola->inicio=cola->final=nuevo;} else { (cola->final)->siguiente=nuevo; cola->final=nuevo; }} int sacar_elemento_cola (Cola *cola) { //coger el inicio de la cola, hacer que su siguiente sea el nuevo //inicio y liberar su memoria asignada. elemento_cola *borrar; tipo_dato_cola elemento; if (cola_vacia(cola)==1) return(0); borrar = cola->inicio; elemento=borrar->dato; cola_inicio=(cola->inicio)->siguiente; free(borrar); return(elemento); }

18

rboles
Un rbol es un conjunto de cero o ms nodos que cumplen:
Existe un nodo especial llamado raz. Los nodos restantes estn separados en n conjuntos distintos, cada uno de los cuales es a su vez un rbol (subrboles).

Elementos de un rbol:
Nodos: elementos del rbol que almacenan informacin. Conexiones: expresan las relaciones entre los nodos.

Estructura del un rbol:


Nodo raz: nodo ms alto de la jerarqua, a partir del cual estn conectados los dems. Nodo terminal u hoja: aquel que no contiene ningn subrbol. Hijos de un nodo: aquellos nodos conectados a un nodo mediante enlace directo. Descendientes: nodos que encontramos al movernos hacia abajo en un rbol. Ascendientes: nodos que encontramos al movernos hacia arriba en un rbol. Padre de un nodo: antecesor directo de un nodo. Hermanos: nodos hijos del mismo padre. Nodos internos: aquellos que tienen a su vez padres e hijos (nodos no terminales). Grado del nodo: el nmero de ramas de un nodo.

19

rboles binarios (1)


Un rbol binario es rbol en que cada nodo tiene como mximo dos hijos.
El nmero de nodos en un nivel i del rbol es como mximo 2i. El nmero mximo de nodos de un rbol de altura k es 2k-1. La implementacin como estructura enlazada en lenguaje C:
typedef struct nodo_arbol_binario { int dato; //puede ser una clave, el dato o un puntero al dato. struct nodo_arbol_binario *izq; struct nodo_arbol_binario *dcho; } nodo_arbol;

Un rbol nulo es un rbol sin nodos. Un rbol es completo si para una altura tiene el mximo nmero posible de nodos. Recorrer un rbol consiste en visitar (y procesar) cada uno de los nodos que lo componen una sola vez y en un determinado orden.
Mtodo preorden. Mtodo inorden. Mtodo postorden.

Estos nombres derivan del lugar en el que se visita la raz con respecto a sus subrboles.

20

rboles binarios (2)


Mtodo preorden:
Visitar un nodo (y procesarlo). Recorrer el subrbol izquierdo en preorden. Recorrer el subrbo derecho en preorden. Ejemplo de implementacin en lenguaje C:
void preorden (nodo_arbol *nodo) { if (nodo!=NULL) { procesar(nodo); //funcin con las operaciones a realizar con el nodo apuntado. preorden(nodo->izq); preorden(nodo->dcha); } }

Mtodo inorden:
Recorrer el subrbol izquierdo en inorden. Visitar el nodo (y procesarlo). Recorrer el subrbo derecho en inorden.

Mtodo inorden:
Recorrer el subrbol izquierdo en postorden. Recorrer el subrbo derecho en postorden. Visitar el nodo (y procesarlo).

21

rboles binarios (3)


Los rboles binarios de bsqueda son rboles ordenados, es decir, son aquellos que cumplen:
Todos los nodos estn identificados por un campo clave, y no hay 2 elementos con la misma clave. Dado un nodo de clave x todos los nodos del subrbol izquierdo tienen una clave menor que x y todos los nodos del subrbol derecho tienen una clave mayor que x Los subrboles izquierdo y derecho son a su vez binarios de bsqueda.

22

rboles binarios (3)


Para buscar un nodo en el rbol
Si la clave buscada es menor que la clave del nodo en el que estamos, continuamos la bsqueda en su subrbol izquierdo y si es mayor, entonces continuamos la bsqueda en su subrbol derecho. Este proceso continua hasta encontrar la clave, o bien hasta llegar a un subrbol vaco.

Para insertar un nodo en el rbol


Primero, hay que verificar si existe un nodo con la misma clave en el rbol mediante una bsqueda. Si no se encuentra, el proceso de bsqueda nos habr conducido hasta un nodo terminal, posicin donde debe aadirse el nuevo nodo.

Para borrar un nodo del rbol


Hay que considerar distintos casos en funcin del tipo del nodo a borrar: nodo terminal (no tiene descendientes), nodo no tiene subrbol izquierdo, nodo no tiene subrbol derecho y nodo tiene subrbol izquierdo y derecho. Primero hay que localizar el nodo a borrar y marcarlo. Despus se analiza si ste tiene descendientes y cuntos, en funcin de esto obtiene su sucesor. Finalmente, se rehacen los enlaces dejando fuera el nodo marcado para borrar.
23

rboles binarios (4)


Un rbol binario es perfectamente equilibrado (o rbol AVL, AdelsonVelskii y Landis) si, para todo nodo, el nmero de nodos en el subrbol izquierdo y el nmero de nodos en el subrbol derecho, difieren como mucho en una unidad.

24

Lenguaje de programacin C

25

Vous aimerez peut-être aussi