自己写的能处理多类型数据的双向链表

类别:编程语言 点击:0 评论:0 推荐:

这个是头文件

/********************************************************************
这个库由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

本文地址:http://com.8s8s.com/it/it26987.htm