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