这个是头文件
/******************************************************************** 这个库由list.h和list.c两个文件组成: list.h文件中包含有提供给用户的链表handle,结点handle 还有一个方便取值的GET宏,还有外部接口的声明 list.c文件中则是链表的数据结构定义部分还有外部接口的定义 简介: 此库为一个泛型化的双向链表,考虑到效率,在单纯的在表头或表尾 添加或删除数据的时候,如果用PushBack,PopBack,PushFront,PopFront, 则速度仅取决于函数调用执行的时间. 如果是随机的插入或删除结点,由于我在接口中定义了一个ListIterator 函数,此函数先判断要操作的结点位置,如果从表头的位置比较靠近,则从 表头操作起,如果从表尾的位置较近,则之. 所以迭代的次数应为 length/2 . 对于异常的处理,则就用了assert. 此库在Dev-C++ 4.9.9.0编译通过 -- avalon QQ : 1243128 01/10/04 18:27 ********************************************************************/ #ifndef LIST_H #define LIST_H #include <stdio.h>
#ifndef LIST_BOOL #define LIST_BOOL #define TRUE 1 #define FALSE 0 typedef int BOOL; #endif
typedef struct LNode LNode , * NodeHandle; typedef struct List List , * ListHandle;
#define GET(DataType,VoidPoint) (*((DataType *)(VoidPoint))) /*这个宏是为了方便用户使用而定义的,因为这个库提供给用户的接口只能 是一个纯粹的指针. DataType:代表了数据类型,如int,long,double VoidPoint:则代表了地址,在这一般为(void *) 如原来:printf("%d ", *((int *)begin(La)) ); 则用宏可写成: printf("%d",GET(int,begin(La)) ); */
NodeHandle MakeNode(ListHandle L,void * data); /*将data里面的内容copy到新分配的空间中的data字段 然后返回新分配空间的地址*/ void FreeNode(NodeHandle * N); /*释放N所指的结点空间*/
NodeHandle ListIterator(ListHandle L,int index); /*根据索引index的值来返回一个指向结点的指针*/
void * GetOf(ListHandle L,int index); /*返回index索引所指的结点中的data数据的指针*/
ListHandle InitList( size_t type); /*构造一个空表 type 表示经由sizeof()传来的值*/
int ListLength(ListHandle L); /*返回表L的长度*/ void * begin(ListHandle L); /*返回表首的数据的指针*/ void * end(ListHandle L); /*返回表尾的数据的指针*/ BOOL ListEmpty(ListHandle L); /*表L是否为空*/
BOOL PushBack(ListHandle L, void * data); /*在表尾压入结点,其数据为data所指的数据*/ BOOL PushFront(ListHandle L, void * data); /*在表首插入一个结点,其数据为data所指的数据*/ BOOL InsertNode(ListHandle L,int index,void *data); /*在索引位置之前插入一个结点,其值为void *里面的内容*/
void * PopBack(ListHandle L); /*从表尾弹出一个结点,并将此结点值的地址返回, 如返回的为NULL,则表示为空表*/ void * PopFront(ListHandle L); /*从表首弹出一个结点,并将此结点值的地址返回, 如返回的为NULL,则表示为空表*/ BOOL DeleteNode(ListHandle L,int index); /*删除索引位置上的结点*/ void ClearList(ListHandle L); /*清空链表L*/ void DestoryList(ListHandle * L); /*销毁链表L*/
#endif

|