MSList *ms_list_insert_sorted(MSList *list, void *data, int (*compare_func)(const void *, const void*)){ MSList *it,*previt=NULL; MSList *nelem; MSList *ret=list; if (list==NULL) return ms_list_append(list,data); else{ nelem=ms_list_new(data); for(it=list;it!=NULL;it=it->next){ previt=it; if (compare_func(data,it->data)<=0){ nelem->prev=it->prev; nelem->next=it; if (it->prev!=NULL) it->prev->next=nelem; else{ ret=nelem; } it->prev=nelem; return ret; } } previt->next=nelem; nelem->prev=previt; } return ret; }
MSList * ms_list_prepend(MSList *elem, void *data){ MSList *new_elem=ms_list_new(data); if (elem!=NULL) { new_elem->next=elem; elem->prev=new_elem; } return new_elem; }
MSList * ms_list_append(MSList *elem, void * data){ MSList *new_elem=ms_list_new(data); MSList *it=elem; if (elem==NULL) return new_elem; while (it->next!=NULL) it=ms_list_next(it); it->next=new_elem; new_elem->prev=it; return elem; }
MSList *ms_list_insert(MSList *list, MSList *before, void *data){ MSList *elem; if (list==NULL || before==NULL) return ms_list_append(list,data); for(elem=list;elem!=NULL;elem=ms_list_next(elem)){ if (elem==before){ if (elem->prev==NULL) return ms_list_prepend(list,data); else{ MSList *nelem=ms_list_new(data); nelem->prev=elem->prev; nelem->next=elem; elem->prev->next=nelem; elem->prev=nelem; } } } return list; }
MSList * ms_list_append(MSList *elem, void * data){ MSList *new_elem=ms_list_new(data); return ms_list_append_link(elem,new_elem); }