📄 list.c
字号:
}/** * xmlListRemoveAll: * @l: a list * @data: list data * * Remove the all instance associated to data in the list * * Returns the number of deallocation, or 0 if not found */intxmlListRemoveAll(xmlListPtr l, void *data){ int count=0; if (l == NULL) return(0); while(xmlListRemoveFirst(l, data)) count++; return count;}/** * xmlListClear: * @l: a list * * Remove the all data in the list */voidxmlListClear(xmlListPtr l){ xmlLinkPtr lk; if (l == NULL) return; lk = l->sentinel->next; while(lk != l->sentinel) { xmlLinkPtr next = lk->next; xmlLinkDeallocator(l, lk); lk = next; }}/** * xmlListEmpty: * @l: a list * * Is the list empty ? * * Returns 1 if the list is empty, 0 if not empty and -1 in case of error */intxmlListEmpty(xmlListPtr l){ if (l == NULL) return(-1); return (l->sentinel->next == l->sentinel);}/** * xmlListFront: * @l: a list * * Get the first element in the list * * Returns the first element in the list, or NULL */xmlLinkPtr xmlListFront(xmlListPtr l){ if (l == NULL) return(NULL); return (l->sentinel->next);} /** * xmlListEnd: * @l: a list * * Get the last element in the list * * Returns the last element in the list, or NULL */xmlLinkPtr xmlListEnd(xmlListPtr l){ if (l == NULL) return(NULL); return (l->sentinel->prev);} /** * xmlListSize: * @l: a list * * Get the number of elements in the list * * Returns the number of elements in the list or -1 in case of error */intxmlListSize(xmlListPtr l){ xmlLinkPtr lk; int count=0; if (l == NULL) return(-1); /* TODO: keep a counter in xmlList instead */ for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++); return count;}/** * xmlListPopFront: * @l: a list * * Removes the first element in the list */voidxmlListPopFront(xmlListPtr l){ if(!xmlListEmpty(l)) xmlLinkDeallocator(l, l->sentinel->next);}/** * xmlListPopBack: * @l: a list * * Removes the last element in the list */voidxmlListPopBack(xmlListPtr l){ if(!xmlListEmpty(l)) xmlLinkDeallocator(l, l->sentinel->prev);}/** * xmlListPushFront: * @l: a list * @data: new data * * add the new data at the beginning of the list * * Returns 1 if successful, 0 otherwise */intxmlListPushFront(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; if (l == NULL) return(0); lkPlace = l->sentinel; /* Add the new link */ lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); if (lkNew == NULL) { xmlGenericError(xmlGenericErrorContext, "Cannot initialize memory for new link"); return (0); } lkNew->data = data; lkNew->next = lkPlace->next; (lkPlace->next)->prev = lkNew; lkPlace->next = lkNew; lkNew->prev = lkPlace; return 1;}/** * xmlListPushBack: * @l: a list * @data: new data * * add the new data at the end of the list * * Returns 1 if successful, 0 otherwise */intxmlListPushBack(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; if (l == NULL) return(0); lkPlace = l->sentinel->prev; /* Add the new link */ if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { xmlGenericError(xmlGenericErrorContext, "Cannot initialize memory for new link"); return (0); } lkNew->data = data; lkNew->next = lkPlace->next; (lkPlace->next)->prev = lkNew; lkPlace->next = lkNew; lkNew->prev = lkPlace; return 1;}/** * xmlLinkGetData: * @lk: a link * * See Returns. * * Returns a pointer to the data referenced from this link */void *xmlLinkGetData(xmlLinkPtr lk){ if (lk == NULL) return(NULL); return lk->data;}/** * xmlListReverse: * @l: a list * * Reverse the order of the elements in the list */voidxmlListReverse(xmlListPtr l){ xmlLinkPtr lk; xmlLinkPtr lkPrev; if (l == NULL) return; lkPrev = l->sentinel; for (lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { lkPrev->next = lkPrev->prev; lkPrev->prev = lk; lkPrev = lk; } /* Fix up the last node */ lkPrev->next = lkPrev->prev; lkPrev->prev = lk;}/** * xmlListSort: * @l: a list * * Sort all the elements in the list */voidxmlListSort(xmlListPtr l){ xmlListPtr lTemp; if (l == NULL) return; if(xmlListEmpty(l)) return; /* I think that the real answer is to implement quicksort, the * alternative is to implement some list copying procedure which * would be based on a list copy followed by a clear followed by * an insert. This is slow... */ if (NULL ==(lTemp = xmlListDup(l))) return; xmlListClear(l); xmlListMerge(l, lTemp); xmlListDelete(lTemp); return;}/** * xmlListWalk: * @l: a list * @walker: a processing function * @user: a user parameter passed to the walker function * * Walk all the element of the first from first to last and * apply the walker function to it */voidxmlListWalk(xmlListPtr l, xmlListWalker walker, const void *user) { xmlLinkPtr lk; if ((l == NULL) || (walker == NULL)) return; for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { if((walker(lk->data, user)) == 0) break; }}/** * xmlListReverseWalk: * @l: a list * @walker: a processing function * @user: a user parameter passed to the walker function * * Walk all the element of the list in reverse order and * apply the walker function to it */voidxmlListReverseWalk(xmlListPtr l, xmlListWalker walker, const void *user) { xmlLinkPtr lk; if ((l == NULL) || (walker == NULL)) return; for(lk = l->sentinel->prev; lk != l->sentinel; lk = lk->prev) { if((walker(lk->data, user)) == 0) break; }}/** * xmlListMerge: * @l1: the original list * @l2: the new list * * include all the elements of the second list in the first one and * clear the second list */voidxmlListMerge(xmlListPtr l1, xmlListPtr l2){ xmlListCopy(l1, l2); xmlListClear(l2);}/** * xmlListDup: * @old: the list * * Duplicate the list * * Returns a new copy of the list or NULL in case of error */xmlListPtr xmlListDup(const xmlListPtr old){ xmlListPtr cur; if (old == NULL) return(NULL); /* Hmmm, how to best deal with allocation issues when copying * lists. If there is a de-allocator, should responsibility lie with * the new list or the old list. Surely not both. I'll arbitrarily * set it to be the old list for the time being whilst I work out * the answer */ if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare))) return (NULL); if (0 != xmlListCopy(cur, old)) return NULL; return cur;}/** * xmlListCopy: * @cur: the new list * @old: the old list * * Move all the element from the old list in the new list * * Returns 0 in case of success 1 in case of error */intxmlListCopy(xmlListPtr cur, const xmlListPtr old){ /* Walk the old tree and insert the data into the new one */ xmlLinkPtr lk; if ((old == NULL) || (cur == NULL)) return(1); for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { if (0 !=xmlListInsert(cur, lk->data)) { xmlListDelete(cur); return (1); } } return (0); }/* xmlListUnique() *//* xmlListSwap */#define bottom_list#include "elfgcchack.h"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -