TDA Vector con Memoria Dinámica
#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; int cap; int ce; } lista; bool crearLista(lista *pl) { pl-> vec = (int*) malloc( 8*sizeof(int)); if(!pl->vec) //pl->vec == NULL return false; pl->ce=0; pl->cap = 8; return true; } int listaInsertarEnOrden( lista *pl, int elem) { int ncap; int *nvec; if( pl->ce == pl->cap) { ncap = pl->cap*2; nvec = (int*)realloc(pl->vec, ncap*sizeof(int)); if(!nvec) return SIN_MEM; pl->vec= nvec; pl->cap = ncap; } int *i = pl->vec; int *ult= pl->vec+(pl->ce-1); while(i <= ult && elem > *i) i++; // chequear si hay duplicados if(i <= ult && elem == *i) return DUPLICADO; for( int *j=ult; j>=i; j--) *(j+1) = *j; *i = elem; pl->ce++; return TODO_OK; } bool listaEliminarOrd(lista*pl, int elem) { if(pl->ce*3 <= pl->cap) // si un tercio del vector esta cargado { pl->cap/=2; pl->vec = (int*)realloc(pl->vec,pl->cap*sizeof(int)); // esta reduciendo } 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+1; j<=ult; j++) *(j-1)=*j; pl->ce--; return true; } void mostrarLista(lista *pl) { int cant = pl->ce; while(cant!=0) { printf("%d\n", *(pl->vec)); pl->vec++; cant--; } } void destruirLista(lista *pl) { free(pl->vec); } int main () { lista l; crearLista(&l); // como no estamos en poo es obligatorio crearlo listaInsertarEnOrden(&l, 2); // no va a insertar al final y luego ordenar. Va insertando en orden. Debo tener la lista ordenada. listaInsertarEnOrden(&l, 1); // no va a insertar al final y luego ordenar. Va insertando en orden. Debo tener la lista ordenada. listaInsertarEnOrden(&l, 6); listaInsertarEnOrden(&l, 9); listaInsertarEnOrden(&l, 5); mostrarLista(&l); return 1; }