#include #include struct punto2d { int x, y; struct punto2d * psig; }; typedef struct punto2d PUNTO2D; struct cola { PUNTO2D *frente, *atras; }; typedef struct cola COLA; /** PUNTO2D * crea_elemento( ); void insertar( COLA *p, PUNTO2D *pnodo ); PUNTO2D * borra( COLA *p ); Las funciones que leen un dato utilizan un bufer de un elemento que debe estar localizado: int lee_frente( COPA *p, PUNTO2D *pnodo ); int lee_atras( COPA *p, PUNTO2D *pnodo ); void imprime_cola( COLA *p ); **/ PUNTO2D * crea_elemento( ) { PUNTO2D *p; p = (PUNTO2D *)malloc( sizeof(PUNTO2D) ); if( p == NULL ) return NULL; p->psig = NULL; // Muy importante!!! return p; } void insertar( COLA *p, PUNTO2D *pnodo ) { if( p->frente == NULL ) { p->frente = pnodo; p->atras = pnodo; } else{ p->atras->psig = pnodo; p->atras = pnodo; } } PUNTO2D * borrar( COLA *p ) { PUNTO2D *pnodo; if( p->frente == NULL ) return NULL; else if( p->frente == p->atras ) { pnodo = p->frente; p->frente = NULL; p->atras = NULL; return( pnodo ); } else { pnodo = p->frente; p->frente = p->frente->psig; pnodo->psig = NULL; return( pnodo ); } } /** Las funciones que leen un dato utilizan un bufer de un elemento que debe estar localizado: **/ int lee_frente( COLA *p, PUNTO2D *pnodo ) { if( p->frente != NULL ) { pnodo -> x = p -> frente -> x; pnodo -> y = p -> frente -> y; pnodo -> psig = NULL; return 0; } return 1; } /** Las funciones que leen un dato utilizan un bufer de un elemento que debe estar localizado: **/ int lee_atras( COLA *p, PUNTO2D *pnodo ) { if( p->atras != NULL ) { pnodo -> x = p -> atras -> x; pnodo -> y = p -> atras -> y; pnodo -> psig = NULL; return 0; } return 1; } void imprime_cola( COLA *pcola ) { PUNTO2D *p; p = pcola -> frente; while( p != NULL ) { printf("%d %d\n", p->x, p->y ); p = p->psig; } } int main( ) { PUNTO2D *pdato; PUNTO2D dato; COLA cola1; // Esto es muy importante! cola1.frente = NULL; cola1.atras = NULL; pdato = crea_elemento( ); if( pdato != NULL ) { pdato->x = 1; pdato->y = 1; } insertar( &cola1, pdato ); pdato = crea_elemento( ); if( pdato != NULL ) { pdato->x = 3; pdato->y = 4; } insertar( &cola1, pdato ); pdato = crea_elemento( ); if( pdato != NULL ) { pdato->x = 5; pdato->y = 6; } insertar( &cola1, pdato ); imprime_cola( &cola1 ); printf("\n"); lee_frente( &cola1, &dato ); printf("Frente: %d %d\n", dato.x, dato.y ); lee_atras( &cola1, &dato ); printf("Atras: %d %d\n", dato.x, dato.y ); while( cola1.frente != NULL ) { pdato = borrar( &cola1 ); printf("%d %d\n", pdato->x, pdato->y ); // AquĆ­ se libera la memoria free( pdato ); } return 0; }