Professional Documents
Culture Documents
Objetivos
Adquirir los conceptos bsicos referente a estructura de datos. Conocer las principales estructuras de datos, desde un punto de vista abstracto, y sus formas de representacin, as como las operaciones que se puedan realizar sobre ellas. Aplicar todos los conceptos adquiridos mediante resolucin de supuestos prcticos siendo capaces de elegir siempre la representacin ms eficiente. Aplicar y adaptar las estructuras de datos a nuevos requisitos de operacin y representacin de informacin.
Ejemplo
struct DatosEstudiante { char cedula[12]; char nombre[32]; char telefono[10]; int notaPrimerParcial; int notaSegundoParcial; };
Ventajas
Mejor organizacin del cdigo, ms expresividad y en consecuencia un mejor cdigo. Acorta el tamao del cdigo para hacer asignaciones de estructuras completas. Ej: estudiante1 = estudiante2. Donde ambas variables son del tipo RegistroEstudiante. Pueden ser pasadas por parmetro y ocurren copias, inclusive de arreglos, al menos con el compilador de GNU.
tipo2 dato2;
tipon daton; } Una propiedad interesante del tipo de dato estructura es que pueden anidarse otras Estructuras indefinidamente.
Sintaxis en C
struct punto { int x; int y; }; // observe el punto y coma al final. El nombre de la estructura es punto y tiene como miembros un par de variables enteras: x e y. Podemos declarar una o mas variables del tipo estructura de la siguiente manera: struct { int var1; float var2; } i, j, k; Notese que i, j y k son declaradas anlogamente como si lo hiciramos con cualquiera de los tipos conocidos. Una vez definida la estructura, pueden hacerse sucesivas declaraciones: struct point w; Y tambin puede utilizarse la inicializacin con llaves: struct point h = {10, 20}; // coordenadas (10,20).
Anidamiento de Estructuras
Las estructuras pueden estar anidadas unas dentro de otras: struct point { int x; int y; }; struct triangle { struct point p1, p2, p3; } t; int main() { // En algn lugar dentro del programa t.p1 = {4, 6}; t.p2.x = 20; t.p2.y = 32; t.p3.x = t.p2.x 10; t.p3.y = t.p3.y + t.p3.x; return 0; }
Anidamiento de Estructuras
Las estructuras pueden estar anidadas unas dentro de otras: struct point { int x; int y; }; struct triangle { struct point p1, p2, p3; } t; int main() { // En algn lugar dentro del programa t.p1 = {4, 6}; t.p2.x = 20; t.p2.y = 32; t.p3.x = t.p2.x 10; t.p3.y = t.p3.y + t.p3.x; return 0; }
Arreglos de Estructuras
Una manera de resolver los arreglos de estructuras es a travs de arreglos paralelos. cadena nombres[n]; cadena apellidos[n];
entero primerParcial[n];
Punteros a Estructuras
Las estructuras tambin pueden ser trabajadas a travs de su direccin de memoria. struct RegistroEstudiante * pre; struct RegistroEstudiante reg1; reg1.nombre = Fernando; reg1.apellido = Corbato; pre = ®1; pre->notaPrimerParcial = 20; // el operado de indireccin -> sirve para acceder // los miembros de una estructura a travs de un // puntero.
Ejemplo 1
Suponga el siguiente caso de una estructura que tiene un apuntador a una estructura de su mismo tipo. struct bloque { int a; float b; struct bloque * s }; Observe que s es un apuntador a estructura del tipo struct bloque.
Ejemplo 2
Como se obtendrian un par de estructuras enlazadas? struct bloque bl1; struct bloque bl2; bl2.s = &bl1; Luego, que puedo hacer con bl1 desde bl2? bl2.s->a = 145; // a pertenece a bl1 cout << bl1.a; // imprime 145...
Estructuras y Funciones
struct trickyStruct { int longArray[10000]; }; void f1(trickyStruct ts); void f2(trickyStruct *ts); void f3() { struct trickyStruct p; // cualquier operacion para llenar p f1(p); // copia todo f2(&p); // solamente pasa la direccion, nos ahorramos 9999 copias... }
Ejemplo
Para comprender mejor un tipo de dato abstracto, podriamos citar la idea (o abstraccin) de poligono. Un polgono es una figura geomtrica plana, compuesta por lineas rectas que se tocan en puntos extremos. Con un polgono podemos hacer las operaciones: rotar, area, permetro.
Ejemplo
Suponga que se tiene la clase persona: class persona { protected: char nombre[20]; char apellido[20]; char edad; public: virtual void pago_pasaje() { ... } }; class estudiante : public persona { public: void pago_pasaje() { // otro procedimiento } };
Implementacion
Cuando ya se tiene bien diseado un Tipo Abstracto, el siguiente paso es decidir una implementacin para el mismo. Esto implica escoger unas estructuras de datos para representar cada uno de los objetos abstractos y escribir una rutina(Procedimiento o funcin) en un lenguaje de programacin, que simule el funcionamiento de cada una de las operaciones de acuerdo con su especificacin. La seleccin de las estructuras de datos determina, en muchos casos, la complegidad del algoritmo que implementa una operacin y es, por esta razn, de gran importancia su escogencia. Existen estructuras de datos muy dependientes de un lenguaje de programacin y debido a esto deben trata de evitarse cuando el TAD se quiere hacer portable.
Ejemplo
class Estudiante { public: float calculo_matricula() }; class Estud_Pregrado : public Estudiante { public: float calculo_matricula() }; Aqu no hay duda, la funcin calculo_matricula ser invocada dependiendo del tipo del objeto. Existe un reemplazo en tiempo de compilaci'on de una funcin por la otra en la clase derivada.
Operaciones
CrearPila Meter Sacar DestruirPila EstaVacia
Representacin
Utilizaremos un array para representar la pila. Definiremos un tamao mximo de array (MaxElemPila). Llevaremos una variable: cima que indicar cual es el ltimo elemento ocupado en el array.
Ejemplo
#define MaxElemPila struct _TPilaEnteros { int elementos[MaxElemPila]; int cima; }; typedef struct _TPilaEnteros TPilaEnteros; void CreaPila (TPilaEnteros *p) { p->cima = 0; }; int InsertaPila (int nelem, TpilaEnteros *p) { if (p->cima==MaxElemPila) { return 0; /*No se ha podido insertar*/ } else { p->cima++; p->elementos[p->cima]=nelem; return 1; }; };
Operaciones
Crear_cola (C: cola, ok:lgico) Borrar_cola (C: cola, ok:lgico) Vaca? (C: cola, resp:lgico) Llena? (C: cola, resp:lgico) Queue (C: cola, E: Elto, resp: lgico) Dequeue (C: cola, E: Elto, resp: lgico) Tamao (C: cola, n: numrico)
Representacin
Primero: indica el ndice de la posicin del primer elemento de la cola, es decir, la posicin el elemento a retornar cuando se invoque sacar. ltimo: indica el ndice de la posicin de ltimo elemento de la cola. Si se invoca encolar, el elemento debe ser insertado en el casillero siguiente al que indica la variable. numElem: indica cuntos elementos posee la cola. Definiendo MAX_ELEM como el tamao mximo del arreglo, y por lo tanto de la cola, entonces la cola esta vaca si numElem==0 y est llena si numElem==MAX_ELEM.
Ejemplo
class ColaArreglo { private Object[] arreglo; private int primero, ultimo, numElem; private int MAX_ELEM=100; // maximo numero de elementos en la cola public ColaArreglo() { arreglo=new Object[MAX_ELEM]; primero=0; ultimo=MAX_ELEM-1; numElem=0; } public void encolar(Object x) { if (numElem<MAX_ELEM) // si esta llena se produce OVERFLOW { ultimo=(ultimo+1)%MAX_ELEM; arreglo[ultimo]=x; numElem++; } } public Object sacar() { if (!estaVacia()) // si esta vacia se produce UNDERFLOW { Object x=arreglo[primero]; primero=(primero+1)%MAX_ELEM; numElem--; return x; } } public boolean estaVacia() { return numElem==0; } }
Operaciones
Creacin: CreaLista Transformacion: VaciarLista, InsertarElementoLista, BorrarElementoLista, ModificarElementoLista Observacin: LongitudLista, RecuperarElementoLista Iteradores: PrimeroLista, SiguienteLista, AnteriorLista, FinalLista
Representacin
La representacin escogida depender de la utilizacin que se le vaya a dar al tipo. Lo normal es implementarlas como listas de elementos enlazados mediante punteros. Los elementos sern estructuras con un uno o varios campos de datos y un campo de tipo puntero que har referencia al siguiente elemento.
Ejemplo
/*lista de enteros*/ struct Tnodo { int dato; struct Tnodo *siguiente; }; typedef struct Tnodo *TLista; /*Permitira iterar sobre la lista*/ typedef struct Tnodo *TPosicion;