/* Nonrecursive delete of list item */ typedef struct node { struct node *next; int number; } NODE, *PNODE; /* (non-recursive) delete of all linked list items with number field n */ /* returns pointer to starting node of new list */ PNODE delete_node(PNODE pnode, int n) { PNODE pnext,pdone; if (pnode == NULL) return NULL; /* empty list - nothing to delete */ /* when node to delete is at beginning of list */ while (pnode->number == n) { pnext = pnode->next; /* save location of next node */ free(pnode); pnode = pnext; if (pnode == NULL) return NULL; /* check if list has become empty */ } /* when node to delete is no longer at beginning of list */ pdone = pnode; /* pdone - node up to which deletes have been done */ while ((pnext = pdone->next) != NULL) { if (pnext->number == n) { pdone->next = pnext->next; /* remove pnext node */ free(pnext); } else pdone = pnext; } return pnode; } /* ** Some ways to advance down a list ** */ /* inline code */ if (pnode != NULL) pnode = pnode->next; /* macro - usage: advance(pnode); */ #define advance(x) ((x) != NULL ? (x) = (x)->next : NULL) /* function - usage: pnode = advance(pnode); */ PNODE advance(PNODE pnode) { if (pnode != NULL) return pnode->next; else return NULL; } /* function - usage: advancep(&pnode); */ void advancep(PNODE *ppnode) { if (*ppnode != NULL) *ppnode = (*ppnode)->next; }