这个是头文件
/********************************************************************
这个库由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