#ident "$URL: svn://elmer/devel/SVN/SDDAS/trunk/libant/LinkInsert.c $ %D% SwRI" /* LinkInsert.c -- insert node into list various ways */ #include "LinkList.h" /* LinkInsert -- insert data into sorted list */ LinkList LinkInsert( LinkList list, void *data, LinkFun compare) { LinkList NewNode; NewNode = LinkCreate(data); if (!list) list = NewNode; else if ((*compare)(data,list->data) <= 0) { NewNode->next = list; list = NewNode; } else { LinkList p; for (p=list; p->next; p=p->next) if ((*compare)(data,p->next->data) <= 0) break; NewNode->next = p->next; p->next = NewNode; } return list; } /* LinkInsertAfter -- insert data after node with reference data */ LinkList LinkInsertAfter(LinkList oldlist,void *ref_data,void *data) { LinkList list; /* used to traverse oldlist */ for (list=oldlist; list; list=list->next) if (list->data == ref_data) { list->next = LinkPush(list->next,data); return oldlist; } return LinkAppend(oldlist,data); } /* LinkInsertAt -- insert data at position n (0=first,-1 or too big= end) */ LinkList LinkInsertAt(LinkList oldlist,int n,void *data) { LinkList list; /* used to traverse oldlist */ LinkList prev; /* previous node in list */ if (n < 0) return LinkAppend(oldlist,data); if (n == 0) return LinkPush(oldlist,data); for (prev=oldlist,list=oldlist->next; list; prev=list,list=list->next) if (--n == 0) { prev->next = LinkPush(list,data); return oldlist; } return LinkAppend(oldlist,data); } /* LinkInsertBefore -- insert data before node with reference data */ LinkList LinkInsertBefore(LinkList oldlist,void *ref_data,void *data) { LinkList list; /* used to traverse oldlist */ LinkList prev; /* previous node in list */ if (oldlist->data == ref_data) return LinkPush(oldlist,data); for (prev=oldlist,list=oldlist->next; list; prev=list,list=list->next) if (list->data == ref_data) { prev->next = LinkPush(list,data); return oldlist; } return LinkAppend(oldlist,data); }