#include #include struct punto2d { int x, y; struct punto2d * psig; }; typedef struct punto2d PUNTO2D; /** PUNTO2D * crea_elemento( ); void inserta_elemento( PUNTO2D **L, PUNTO2D *nodo ); void insertaDespues( PUNTO2D *paqui, PUNTO2D *pnodo ); void insertaAntes( PUNTO2D **pL, PUNTO2D *paqui, PUNTO2D *pnodo ); PUNTO2D * obtiene_elemento( PUNTO2D *L, PUNTO2D *pnodo ); void actualiza_elemento( PUNTO2D *L, PUNTO2D *pbusca, PUNTO2D *pnodo ) void borra_lista( PUNTO2D **pL ); void imprime_lista( PUNTO2D *L ); int calcula_largo( PUNTO2D *L ); **/ PUNTO2D * crea_elemento( ) { PUNTO2D *p; p = (PUNTO2D *)malloc( sizeof(PUNTO2D) ); if( p == NULL ) return NULL; p->psig = NULL; // Muy importante!!! return p; } void inserta_elemento( PUNTO2D **L, PUNTO2D *nodo ) { if( *L == NULL ) { *L = nodo; } else{ nodo->psig = *L; *L = nodo; } } /** paqui es una copia del puntero al nodo donde se insertarĂ¡ pnode es un puntero al dato que se insertarĂ¡ **/ void insertaDespues( PUNTO2D *paqui, PUNTO2D *pnodo ) { if ( paqui != NULL ) { if( paqui->psig == NULL ) { paqui->psig = pnodo; } else { pnodo->psig = paqui->psig; paqui->psig = pnodo; } } } /** pL un puntero a la lista, porque se puede modicar el inicio de ella paqui es una copia del puntero al nodo donde se insertarĂ¡ pnode es un puntero al dato que se insertarĂ¡ **/ void insertaAntes( PUNTO2D **pL, PUNTO2D *paqui, PUNTO2D *pnodo ) { PUNTO2D *pantes; if ( paqui != NULL ){ if( *pL == paqui ) { pnodo -> psig = *pL; *pL = pnodo; } else { pantes = *pL; while( pantes->psig != paqui && pantes->psig != NULL ) pantes = pantes -> psig; pnodo->psig = paqui; pantes->psig = pnodo; } } } /** Busca el elemento apuntado por pnodo en la lista. Como no modifica el inicio de la lista, pasamos una copia en L **/ PUNTO2D * obtiene_elemento( PUNTO2D *L, PUNTO2D *pnodo ) { while( L->psig != NULL ) { if( L->x == pnodo->x && L->y == pnodo->y ) return( L ); L = L->psig; } return NULL; } int calcula_largo( PUNTO2D *p ) { int n=0; while( p != NULL ){ n++; p = p->psig; } return n; } void actualiza_elemento( PUNTO2D *L, PUNTO2D *pbusca, PUNTO2D *pnodo ) { PUNTO2D *p; p = obtiene_elemento( L, pbusca ); if ( p != NULL ) { p->x = pnodo->x; p->y = pnodo->y; } } /** Se le puede pasar una copia de la lista porque no modificamos la lista al imprimir **/ void imprime_lista( PUNTO2D *p ) { while( p != NULL ) { printf("%d %d\n", p->x, p->y ); p = p->psig; } } void borra_lista( PUNTO2D **pL ) { PUNTO2D *p; p = *pL; while( p != NULL ) { // Error: *pL = *pL->psig; *pL = (*pL)->psig; free( p ); p = *pL; } } int main( ) { PUNTO2D *Lista = NULL; PUNTO2D *p, *p2; PUNTO2D dato; p = crea_elemento( ); if( p != NULL ) { p->x = 1; p->y = 1; } inserta_elemento( &Lista, p ); p = crea_elemento( ); if( p != NULL ) { p->x = 3; p->y = 4; } inserta_elemento( &Lista, p ); p = crea_elemento( ); if( p != NULL ) { p->x = 5; p->y = 5; } insertaDespues( Lista, p ); p = crea_elemento( ); if( p != NULL ) { p->x = 2; p->y = 2; } insertaDespues( Lista->psig, p ); p = Lista; p = p->psig; p = p->psig; p2 = crea_elemento( ); if( p2 != NULL ) { p2->x = 8; p2->y = 3; } insertaAntes( &Lista, p, p2 ); imprime_lista( Lista ); printf("\n"); dato.x = 12; dato.y = 10; actualiza_elemento( Lista, p2, &dato ); imprime_lista( Lista ); printf( "Largo de la lista: %d\n", calcula_largo( Lista ) ); borra_lista( &Lista ); return 0; }