void *emalloc( size_t nbytes) { // malloc() with exit on error void *p = malloc(nbytes); if(!p) { fprintf( stderr, "malloc() failed\n"); exit(1); } return p; } typedef struct node { double x; int y; /* ... data ... */ struct node *next; } Node; #if BLOCK static Node *head = 0; static int block = 1000; // number of nodes to allocate at one time Node *new_node( void) { if( !head) { // allocate a block of nodes head = emalloc(block*sizeof(Node)); Node *last = head+block-1; for( Node *p = head; p < last; ++p) p->next = p+1; // link the nodes last->next = 0; } Node *n = head; head = head->next; return n; // return head of list } void free_node( Node *n) { n->next = head; head = n; // insert at head of list } #else #define new_node() emalloc(sizeof(Node)) #define free_node(n) free(n) #endif