这个东西,是在写斐波那契堆的时候发现的.觉得这东西很好,很好用,很方便.呵呵.所以啊,昨天给实现了,凑代码吗?不高级,实现的细节问题也不多.
呵呵,不多说了,贴出来吧.明天会休息呢,所以来调兵了,玩了会球,感觉不错呢.
/*DoubleCircularLinkedList .h -- 双向循环链表头文件*/
#include
#include
/*明显常量定义*/
#define FALSE (0)
#define TRUE (1)
/*数据类型定义*/
typedef int BOOL ;
typedef int Item ;
typedef struct node
{
Item item ;
struct node * left, * right ;
} Node ;
typedef struct doublecircularlinkedlist
{
Node * list ;
int current ;
} * DoubleCircularLinkedList ;
/*接口函数声明*/
/*操作:创建并初始化一个双向循环链表*/
/*操作前:pl 指向一个双向循环链表*/
/*操作后:如果内存分配成功, 创建并初始化该双向循环链表为空, 返回 TRUE ; 否则返回 FALSE*/
/*时间复杂度:O (1)*/
BOOL Create_B (DoubleCircularLinkedList * const pl) ;
/*操作:确定一个双向循环链表是否为空*/
/*操作前:pl 指向一个已初始化的双向循环链表*/
/*操作后:如果该双向循环链表为空, 返回 TRUE ; 否则返回 FALSE*/
/*时间复杂度:O (1)*/
BOOL IsEmpty_B (const DoubleCircularLinkedList * const pl) ;
/*操作:向一个双向循环链表中添加结点*/
/*操作前:pl 指向一个已初始化的双向循环链表, pi 指向待添加元素的数据*/
/*操作前:如果内存分配成功, 向该双向循环链表中添加该元素, 返回 TRUE ; 否则返回 FALSE*/
/*时间复杂度:O (1)*/
BOOL Insert_B (const DoubleCircularLinkedList * const pl, const Item * const pi) ;
/*操作:确定指定数据是否出现在双向循环链表中*/
/*操作前:pl 指向一个已初始化的双向循环链表, pi 指向待查找数据*/
/*操作后:如果找到该数据, 返回指向数据域为该数据的结点的指针 ; 否则返回 NULL*/
/*时间复杂度: O (N)*/
Node * Find_B (const DoubleCircularLinkedList * const pl, const Item * const pi) ;
/*操作:删除数据域为指定数据的结点*/
/*操作前:pl 指向一个已初始化的双向循环链表, pi 指向待删除数据*/
/*操作后:如果找到该结点, 删除该结点, 返回 TRUE ; 否则返回 FALSE*/
/*时间复杂度:O (N)*/
BOOL Delete_B (const DoubleCircularLinkedList * const pl, const Item * const pi) ;
/*操作:将一个函数依次作用于双向循环链表所有结点1次*/
/*操作前:pl 指向一个已初始化的双向循环链表, pfun 指向一个没有返回值, 接受一个 Node * 类型参数的函数*/
/*操作后:fpun 指向的函数被依次作用于该双向循环链表中所有结点1次*/
/*时间复杂度:O (N)*/
void Traversal_B (const DoubleCircularLinkedList * const pl, void (* pfun) (const Node * const pn)) ;
/*操作:释放一个双向循环链表所占用的内存空间*/
/*操作前:pl 指向一个已初始化的双向循环链表*/
/*操作后:该双向循环链表所占用的内存空间被释放*/
/*时间复杂度:O (N)*/
void Release_B (const DoubleCircularLinkedList * const pl) ;