Tipos de Relación:
- Uno a uno (Ejemplo: Nombre <--> D.N.I.).
- Uno a muchos (Ejemplo: Equipo <-->> Jugador).
- Muchos a muchos (Ejemplo: Alumno <<-->> Asignatura).
Representación de relaciones muchos a muchos.
- Matriz.
- Listas.
- Multilistas.
Dados dos tipos de entidades, TipoA y TipoB, se necesitan:
- Dos nuevos tipos correspondientes a los nodos para cada clase de entidad, que junto con la información propia de la entidad incluye los punteros necesarios para mantener la estructura.
typedef struct NodoTipoA { TipoA Info; NodoRelacion *PrimerB; } NodoTipoA; typedef struct NodoTipoB{ TipoB Info; NodoRelacion *PrimerA; } NodoTipoB;
- Una estructura para agrupar los objetos de cada tipo de entidad (Array, Lista,Árbol, Tabla Hash, ...).
- Un TDA Nodo Relacion que incluye un puntero por cada lista así como información propia de la relación.
typedef struct NodoRelacion { NodoTipoA *SiguienteA; NodoTipoB *SiguienteB; <tipo1> campo1; ........ <tipon> campo_n; } NodoRelacion;
- Un nodo Multilista que engloba los distintos tipos de nodos (entidad A, entidad B y relación). El tipo de dato para construir esto es el registro variante:
typedef enum {NODO_A, NODO_B, NODO_ML} TipoNodo; typedef struct NodoMultilista { TipoNodo tipo; union { NodoTipoA a; NodoTipoB b; NodoRelacion nr; } cont; } NodoMultilista;
Localizar todas las entidades de TipoA relacionadas con la entidad B de TipoB.
void BuscarEntidadesA (EntidadB B){
NodoMultilista a, b, r;
b = Direccion(B);
/* Depende de como se agrupen los NodoTipoB. */
r = b.cont.b.PrimerA;
/* Mediante r se recorre el conjunto de entidades TipoA para B. */
while (r.tipo == NODO_ML) {
a = r;
do
a = a.cont.nr.SiguienteB;
while (a.tipo == NODO_ML)
Escribe(a.cont.a.Info);
r = r.cont.nr.SiguienteA;
};
};
TDA Relacion: crear, añadeAlum, añadeAsig, borrarAlum, borrarAsig, añadir, borrar, existe, escribeAsig, escribeAlum, destruir.
Definición: Dados los TDAs Alumno y Asignatura, los objetos Relacion representan las relaciones (matrícula, calificación) entre un conjunto de Alumnos y un conjunto de Asignaturas.
- Son objetos mutables.
- Residen en memoria dinámica.
NumAlum: Número máximo de alumnos.Efecto: (Constructor Primitivo): Crea un objeto del tipo Relacion, que representa las matrículas de hasta un máximo de NumAlum alumnos en un máximo de NumAsig asignaturas.Devuelve un objeto vacío, sin alumnos, asignaturas, ni vínculos entre éstos.
NumAsig: Número máximo de asignaturas.
al: Un alumno.Efecto: Añade el alumno al a la relación r, sin establecer ningún vínculo con las asignaturas.
r: El número de alumnos debe ser menor del máximo. Es modificada.
as: Una asignatura.Efecto: Añade la asignatura as a la relación r, sin establecer ningún vínculo con los alumnos.
r: El número de asignaturas debe ser menor del máximo.Es modificada.
al: Alumno que debe existir en r.Efecto: Elimina todos los vínculos del alumno al con asignaturas en r. Después elimina el alumno de r.
r: Es modificada.
as: Asignatura que debe existir en r.Efecto: Elimina todos los vínculos de la asignatura as con alumnos en r. Después elimina la asignatura de r.
r: Es modificada.
al: Alumno que debe existir en r.Efecto: Establece un vínculo entre el alumno al y la asignatura as.
as: Asignatura que debe existir en r.
r: Es modificada.
al: Alumno que debe existir en r.Efecto: Si en r existe un vínculo entre el alumno al y la asignatura as, devuelve VERDAD.En otro caso, devuelve FALSO.
as: Asignatura que debe existir en r.
r: Una relación.
al: Alumno que debe existir en r.Efecto: Si existe un vínculo entre el alumno al y la asignatura as, es eliminado.
as: Asignatura que debe existir en r.
r: Es modificada.
al: Alumno que debe existir en r.Efecto:Escribe en la salida estándar una lista de las asignaturas relacionadas con el alumno al en r.
r: Una relación.
typedef void *pnodo;
typedef struct NodoTipoA {
TipoA info;
pnodo *PrimerB;
} NodoTipoA;
typedef struct NodoTipoB {
TipoB info;
pnodo *PrimerA;
} NodoTipoB;
typedef struct NodoRel {
pnodo SiguienteB;
pnodo SiguienteA;
} NodoRel;
typedef enum {NODO_A, NODO_B, NODO_REL} TipoNodo;
typedef struct nodo {
TipoNodo tipo;
union {
NodoRel nr;
NodoTipoA na;
NodoTipoB nb;
} cont;
} nodo;