这个东西,是在写斐波那契堆的时候发现的.觉得这东西很好,很好用,很方便.呵呵.所以啊,昨天给实现了,凑代码吗?不高级,实现的细节问题也不多.
呵呵,不多说了,贴出来吧.明天会休息呢,所以来调兵了,玩了会球,感觉不错呢.
/* 明显常量定义 */
#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) ;