⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 htlist.c

📁 www工具包. 这是W3C官方支持的www支撑库. 其中提供通用目的的客户端的WebAPI: complete HTTP/1.1 (with caching, pipelining, PUT, POS
💻 C
字号:
/*								       HTList.c**	MANAGEMENT OF LINKED LISTS****	(c) COPYRIGHT MIT 1995.**	Please first read the full copyright statement in the file COPYRIGH.**	@(#) $Id: HTList.c,v 2.33 2000/06/15 13:48:44 kahan Exp $****	A list is represented as a sequence of linked nodes of type HTList.**	The first node is a header which contains no object.**	New nodes are inserted between the header and the rest of the list.*//* Library include files */#include "wwwsys.h"#include "HTUtils.h"#include "HTList.h"PUBLIC HTList * HTList_new (void){    HTList *newList;    if ((newList = (HTList  *) HT_CALLOC(1, sizeof (HTList))) == NULL)        HT_OUTOFMEM("HTList_new");    newList->object = NULL;    newList->next = NULL;    return newList;}PUBLIC BOOL HTList_delete (HTList * me){    if (me) {	HTList *current;	while ((current = me)) {	    me = me->next;	    HT_FREE(current);	}	return YES;    }    return NO;}PUBLIC BOOL HTList_addObject (HTList * me, void * newObject){    if (me) {	HTList *newNode;	if ((newNode = (HTList  *) HT_CALLOC(1, sizeof(HTList))) == NULL)	    HT_OUTOFMEM("HTList_addObject");	newNode->object = newObject;	newNode->next = me->next;	me->next = newNode;	return YES;    } else {	HTTRACE(CORE_TRACE, "HTList...... Can not add object %p to nonexisting list\n" _ 		    newObject);    }    return NO;}PUBLIC BOOL HTList_appendObject (HTList * me, void * newObject){    if (me) {	while (me->next) me = me->next;	return HTList_addObject(me, newObject);    }    return NO;}PUBLIC BOOL HTList_removeObject (HTList * me, void * oldObject){    if (me) {	HTList *previous;	while (me->next) {	    previous = me;	    me = me->next;	    if (me->object == oldObject) {		previous->next = me->next;		HT_FREE(me);		return YES;	/* Success */	    }	}    }    return NO;			/* object not found or NULL list */}PUBLIC HTList * HTList_addList (HTList * me, void * newObject){    if (me) {	HTList *newNode;	if ((newNode = (HTList  *) HT_CALLOC(1, sizeof(HTList))) == NULL)	    HT_OUTOFMEM("HTList_addObject");	newNode->object = newObject;	newNode->next = me->next;	me->next = newNode;	return newNode;    } else {	HTTRACE(CORE_TRACE, "HTList...... Can not add object %p to nonexisting List\n" _ newObject);    }    return (HTList *) NULL;}PUBLIC HTList * HTList_appendList (HTList * me, void *newObject){    if (me) {	while (me->next) 	    me = me->next;	return HTList_addList(me, newObject);    }    return (HTList *) NULL;}PUBLIC BOOL HTList_quickRemoveElement (HTList * me, HTList * last){    if (me && last) {	last->next = me->next;	HT_FREE(me);	return YES;	/* Success */    }    return NO;			/* object not found or NULL list */}PUBLIC BOOL HTList_removeObjectAll (HTList * me, void * oldObject){ BOOL found = NO; if (me)   {    HTList* i;    while ((i = me->next))      {       if (i->object == oldObject)	 {	  me->next = i->next;	  HT_FREE(i);	  found = YES;	/* At least one object found */	 }        else	 {	  me = i;	 }      }   } return found;}PUBLIC void * HTList_removeLastObject  (HTList * me){    if (me && me->next) {	HTList *lastNode = me->next;	void * lastObject = lastNode->object;	me->next = lastNode->next;	HT_FREE(lastNode);	return lastObject;    } else			/* Empty list */	return NULL;}PUBLIC void * HTList_removeFirstObject  (HTList * me){    if (me && me->next) {	HTList * prevNode;	void *firstObject;	while (me->next) {	    prevNode = me;	    me = me->next;	}	firstObject = me->object;	prevNode->next = NULL;	HT_FREE(me);	return firstObject;    } else			/* Empty list */	return NULL;}PUBLIC void * HTList_firstObject  (HTList * me){    if (me && me->next) {	HTList * prevNode;	while (me->next) {	    prevNode = me;	    me = me->next;	}	return me->object;    } else			/* Empty list */	return NULL;}PUBLIC int HTList_count  (HTList * me){    int count = 0;    if (me)	while ((me = me->next))	    count++;    return count;}PUBLIC int HTList_indexOf (HTList * me, void * object){    if (me) {	int position = 0;	while ((me = me->next)) {	    if (me->object == object)		return position;	    position++;	}    }    return -1;}PUBLIC int HTList_indexOfElement (HTList * me, HTList * element){    if (me) {	int position = 0;	if (me == element)	    return -1;	while ((me = me->next)) {	    if (me == element)		return position;	    position++;	}    }    return -2;}PUBLIC HTList * HTList_elementOf (HTList * cur, void * object, HTList ** pLast){    HTList * 	last = cur;    void *	pres;    while ((pres = HTList_nextObject(cur))) {        if (pres == object) {	    if (pLast)		*pLast = last;	    return cur;	}	last = cur;    }    /*    **	didn't find object, but return end of list so it is easy to append    */    if (pLast)	*pLast = last;    return NULL;}PUBLIC void * HTList_objectAt  (HTList * me, int position){    if (position < 0)	return NULL;    if (me) {	while ((me = me->next)) {	    if (position == 0)		return me->object;	    position--;	}    }    return NULL;		/* Reached the end of the list */}PUBLIC void * HTList_removeObjectAt  (HTList * me, int position){    if (position < 0)	return NULL;    if (me) {	HTList * prevNode;	prevNode = me;	while ((me = me->next)) {	    if (position == 0) {		prevNode->next = me->next;		return me->object;	    }	    prevNode = me;	    position--;	}    }    return NULL;  /* Reached the end of the list */}/***  Do an insertion sort algorithm on the list. An empty list is already**  sorted and so is a single element list.*/PUBLIC BOOL HTList_insertionSort (HTList * head, HTComparer * comp){    HTList *tail, *q, *r, *p;    if (head && head->next && comp) {	tail = head->next;	while (tail->next) {	    q = tail->next;	    /*	    **  Depending on the return status of the comparer we either move	    **  the sentinel down the list or search the sorted sublist to	    **  insert it.	    */	    if (comp(q->object, head->next->object) >= 0) {		tail->next = q->next;		q->next = head->next;		head->next = q;	    } else {		r = head->next;		p = r->next;		while (comp(q->object, p->object) < 0) {		    r = p;		    p = r->next;		}		    		/*		**  If sentinel was found then q is already in right place.		**  Otherwise we'll have to move it		*/		if (q == p)		    tail = q;		else {		    tail->next = q->next;		    q->next = p;		    r->next = q;		}	    }	}	return YES;    } else {	HTTRACE(CORE_TRACE, "List........ Empty list or no sort algorithm\n");    }    return NO;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -