// Filename : LIST.C // Coded by : Scott Evans // Created/Modified : 15/2/98 // Description : Routines to handle generic linked lists #include "list.h" // Free nodes, pointer to first free node LIST_NODE free_nodes[MAX_FREE_NODES]; LIST_NODE *first_free_node=0; // Function : InitFreeNodes() // Coded by : Scott Evans // Created/Modified : 15/2/98 // Description : Set up an a list of free nodes // Parameters : None // Returns : None // Notes : Need to call this before othe list functions void InitFreeNodes(void) { u_word i; for(i=0;ino_nodes++; // Get free node new_node=first_free_node; first_free_node=first_free_node->next; new_node->next=0; // Add new node to end of list if(h->start) { LIST_NODE *node=h->start; while(node->next) node=node->next; node->next=new_node; } else h->start=new_node; return(new_node); } return(0); } // Function : RemoveFromList() // Coded by : Scott Evans // Created/Modified : 15/2/98 // Description : Remove a node from a list // Parameters : h - pointer to header of list // dead_node - pointer to node to remove // Returns : None // Notes : None void RemoveFromList(LIST_HEADER *h,LIST_NODE *dead_node) { LIST_NODE *node; // Are there any nodes to remove from list if(node=h->start) { h->no_nodes--; // Removing from start of list if(node==dead_node) h->start=dead_node->next; else { // Removing from the middle while(node->next!=dead_node) node=node->next; node->next=dead_node->next; } // Return node to free node list node=first_free_node; if(node) { while(node->next) node=node->next; node->next=dead_node; } else first_free_node=dead_node; dead_node->next=0; } }