本文将介绍一种高效的双端队列(链表),包括数据结构、新建队列、插入头结点、插入尾节点、删除头结点等,所有操作的时间复杂度均为O(1)。
为了方便理解,部分函数前面均配了一幅图作为介绍。
首先,数据结构定义如下:
typedef struct node_s {
struct node_s *node_Next;
struct node_s *node_Prev;
int data[DATASIZE];
} node;
typedef struct list_s {
node *list_Head;
node *list_Tail;
node *list_TailPrev;
int reserved;
} list;
初始化队列:
inline void NewList(list *l)
{/* initialize a new list. */
l->list_Head = (node *)&l->list_Tail; /* step 1 */
l->list_Tail = NULL; /* step 2 */
l->list_TailPrev = (node *)&l->list_Head; /* step 3 */
}
添加尾节点(链表非空的情况下):
inline void AddTail(list *l, node *n)
{/* add a node to it's list tail. */
n->node_Next = l->list_Tail; /* step 1 */
n->node_Prev = (node *)&l->list_TailPrev; /* step 2 */
n->node_Next->node_Prev = n; /* step 3 */
n->node_Prev->node_Next = n; /* step 4 */
}
添加头结点:
inline void AddHead(list *l, node *n)
{/* add a node to it's list head. */
n->node_Next = l->list_Head;
n->node_Prev = (node *)&l->list_Head;
n->node_Next->node_Prev = n;
n->node_Prev->node_Next = n;
}
删除头结点:
inline void RemoveNode(node *n)
{/* given a node, remove it from list. */
if(NULL != n->node_Prev)
n->node_Prev->node_Next = n->node_Next;
if(NULL != n->node_Next)
n->node_Next->node_Prev = n->node_Prev;
n->node_Prev = NULL;
n->node_Next = NULL;
}
inline node* RemoveHead(list *l)
{/* given a list, remove it's head and than return it's head. */
node *n;
n = l->list_Head;
if(mn != (node *)&l->list_Tail)
{
RemoveNode(n);
}
else
{
/* List is empty */
n = NULL;
}
return(n);
}
合并两个链表:
#define IsListEmpty(l) ((l)->list_TailPrev == (node *)l)
inline void PrependList(list *l, list *pl)
{/* merge list l and pl. */
if(!IsListEmpty(pl))
{
pl->list_TailPrev->node_Succ = l->list_Head;
l->list_Head->node_Prev = pl->list_TailPred;
l->list_Head = pl->list_Head;
pml->list_Head->node_Prev = (node *)&l->list_Head;
/* We moved all the entries, empty out the 2nd list now */
NewList(pl);
}
}
好了,同学们,大部分操作都介绍完了。老师给你们布置一个作业,要求大家把inline void RemoveTail(list *l)实现出来。
希望大家能在学习和实现的过程中,认真体会链表和C语言结构体的美妙之处。