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

📄 lsort.h

📁 主要进行大规模的电路综合
💻 H
字号:
/* * Revision Control Information * * /projects/hsis/CVS/utilities/list/lsort.h,v * rajeev * 1.3 * 1995/08/08 22:39:59 * *//* *  Generic linked-list sorting package *  Richard Rudell, UC Berkeley, 4/1/87 * *  Use: *	#define TYPE		the linked-list type (a struct or typedef) *	#define SORT		sorting routine (see below) *	#include "lsort.h" * *  Optional: *	#define NEXT		'next' field name in the linked-list structure *	#define DECL_SORT	'static' or undefined *	#define DECL_SORT1	'static' or undefined *	#define SORT1		optional sorting routine interface *	#define FIELD		select subfield of the structure for compare *	#define DIRECT_COMPARE	in-line expand the compare routine * *  This defines up to two routines: *	DECL_SORT TYPE * *	SORT1(list, compare) *	TYPE *list; *	int (*compare)(TYPE *x, TYPE *y); *	    sort the linked list 'list' according to the compare function *	    'compare' * *	DECL_SORT1 TYPE * *	SORT(list, compare, length) *	TYPE *list; *	int (*compare)(TYPE *x, TYPE *y); *	int length; *	    sort the linked list 'list' according to the compare function *	    'compare'.  length is the length of the linked list. * *  Both routines gracefully handle length == 0 (in which case, list == 0  *  is also allowed). * *  NEXT defines the name of the next field in the linked list.  If not *  given, 'next' is assumed. * *  By default, both routines are declared 'static'.  This can be changed *  using '#define DECL_SORT' or '#define DECL_SORT1'. * *  If FIELD is used, then a pointer to the particular field is passed *  to the comparison function (rather than a TYPE *).  In this case, *  the compare function is called with: *	 *		if ((*compare)(x->FIELD, y->FIELD)) { * *  If DIRECT_COMPARE is used, then the 'FIELD' items are compared using *  a simple '>' (useful for scalars to save subroutine overhead) */#ifndef NEXT#define NEXT next#endif#ifndef DECL_SORT1#define DECL_SORT1 static#endif#ifndef DECL_SORT#define DECL_SORT static#endifDECL_SORT TYPE *SORT();#ifdef SORT1DECL_SORT1 TYPE *SORT1(list_in, compare)TYPE *list_in;int (*compare)();{    register int cnt;    register TYPE *p;    /* Find the length of the list */    for(p = list_in, cnt = 0; p != 0; p = p->NEXT, cnt++)	;    return SORT(list_in, compare, cnt);}#endifDECL_SORT TYPE *SORT(list_in, compare, cnt)TYPE *list_in;int (*compare)();int cnt;{    register TYPE *p, **plast, *list1, *list2;    register int i;    if (cnt > 1) {	/* break the list in half */	for(p = list_in, i = cnt/2-1; i > 0; p = p->NEXT, i--)	    ;	list1 = list_in;	list2 = p->NEXT;	p->NEXT = 0;	/* Recursively sort the sub-lists (unless only 1 element) */	if ((i = cnt/2) > 1) {	    list1 = SORT(list1, compare, i);	}	if ((i = cnt - i) > 1) {	    list2 = SORT(list2, compare, i);	}	/* Merge the two sorted sub-lists */	plast = &list_in;	for(;;) {#ifdef FIELD#ifdef DIRECT_COMPARE	    if (list1->FIELD < list2->FIELD) {#else	    if ((*compare)(list1->FIELD, list2->FIELD) <= 0) {#endif#else	    if ((*compare)(list1, list2) <= 0) {#endif		*plast = list1;		plast = &(list1->NEXT);		if ((list1 = list1->NEXT) == 0) {		    *plast = list2;		    break;		}	    } else {		*plast = list2;		plast = &(list2->NEXT);		if ((list2 = list2->NEXT) == 0) {		    *plast = list1;		    break;		}	    }	}    }    return list_in;}#undef TYPE#undef SORT#undef SORT1#undef DECL_SORT#undef DECL_SORT1#undef FIELD#undef DIRECT_COMPARE#undef NEXT

⌨️ 快捷键说明

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