双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,一般分为带头结点双向链表,和不带头结点(带头指针)双向链表(多用做循环双向链表) 。
1.带头结点的双向链表(有两个指针域,一个指向它的前驱,一个指向它的后继)
(1)、双向链表的存储结构
双向链表和单链表的区别在于双向链表除了与单链表具有相同的数据域和next域之外,有一个指向前驱的prev域,双向链表中头结点的前驱指向空,尾结点的后继指向空。
typedef int ElemType;
typedef struct Node
{
struct Node *prev;
ElemType data;
struct Node *next;
}Node;
typedef struct DoubleList
{
Node head;
int count;
}DoubleList, *pDoubleList;
(2)、双向链表的初始化
void InitDoubleList(pDoubleList list)
{
assert(list != NULL);
list->count = 0;
list->head.next = list->head.prev = NULL;
}
(3)、双向链表的扩充
static Node *BuyNode(ElemType val, Node *prev, Node *next)
{
Node *s = (Node *)malloc(sizeof(Node));
assert(s != NULL);
s->data = val;
s->next = next;
s->prev = prev;
return s;
}
(4)双向链表的插入
双向链表有一个next域域prev域,所以我们需要将创建的结点的prev域指向前一个结点,next域指向后一个