8 – Tipo de Dato Abstracto (TDA)

Un Tipo de Dato Abstracto (TDA) en C es una estructura de datos que encapsula un conjunto de datos y las operaciones que se pueden realizar en esos datos. El objetivo principal de un TDA es ocultar los detalles de implementación de los datos y proporcionar una interfaz clara y definida para interactuar con ellos. Los TDAs son una forma efectiva de organizar y gestionar datos en programas C, ya que promueven la modularidad y la reutilización de código.

  • Encapsula un conjunto de datos y operaciones.
  • Oculta detalles de implementación.
  • Proporciona una interfaz clara y definida para interactuar con los datos y operaciones.
  • Promueven la modularidad.
  • Promueven la reutilización de código.

El TDA esta compuesto por dos componentes:

  • El TIPO EN SI ( Con los campos).
  • FUNCIONES ( Con los que voy a operar). Estas y solo estas tienen acceso al interior de esta estructura.

Es como un auto,No necesito conocer la mecánica, sino la interfaz.

Un ejemplo de un TDA común en C es un TDA Vector, que representa una colección de elementos que se pueden acceder, agregar, eliminar y manipular de diversas maneras.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define CAP 100
#define SIN_MEM 0
#define DUPLICADO 2
#define TODO_OK 1



typedef struct
{
    int vec[CAP];
    int ce;  //cant de elementos cargados
    int cap;
} Lista;

void crearLista(Lista *pl);
int insertarEnOrden(Lista *pl, int elem);
bool listaEliminarOrdenado(Lista *pl, int elem);
void mostrar(Lista *pl);

int main ()
{
    Lista l;
    crearLista(&l);  // como no estamos en poo es obligatorio crearlo
    insertarEnOrden(&l, 2); // no va a insertar al final y luego ordenar. Va insertando en orden. Debo tener la lista ordenada
    insertarEnOrden(&l, 5);
    insertarEnOrden(&l, 1);
    mostrar(&l);
    return 1;

}

void crearLista(Lista *pl)
{
    pl->ce=0;
    pl->cap = CAP;
}

int insertarEnOrden(Lista *pl, int elem)
{
    int *i = pl->vec;
    int *ult = pl-> vec + pl->ce -1;
    if(pl->ce == pl->cap)
        return SIN_MEM;
    while(i<=ult && elem > *i)
        i++;
    if(i<= ult && elem == *i)
        return DUPLICADO;
    for(int* j = ult ; j>=i ; j--)
        *(j+1) = *j;
    *i= elem;
    pl->ce++;
    return TODO_OK;

}

void mostrar(Lista *pl)
{
 int cant = 0;
 while(cant!=pl->ce)
 {
     printf("%d\n", pl->vec[cant]);
     cant++;
 }
}

bool listaEliminarOrdenado(Lista *pl, int elem)
{
    if (pl->ce == 0)
        return false;
    int *i = pl-> vec;
    int *ult = pl->vec + pl->ce -1;
    while( i <= ult && elem > *i)
        i++;
    if ( i> ult || elem != *i)
        return false;
    for (int *j = i ; j<ult; j++)
        *j = *(j+1);
    pl-> ce--;
    return true;
}

Resolver: insertar en posición, insertar al inicio, insertar al final, ordenar. Buscar ordenado, buscar desordenado.

ListaVector Con Memoria Dinámica