对于双链表中,由于每个结点既包含一个指向后继结点的指针,又包含这个指向前驱结点的指针,所有访问一个结点既可以依次向后访问每一个结点,又可以依次向前访问每一个结点。
双链表有些运算的算法与单链表相应的算法是相同的,主要的是双链表的插入和删除操作与单链表有所区别。可以参考单链表的算法实现。
双链表的实现:
1.声明双链表类型
typedef int ElemType;
typedef struct DNode
{
ElemType data; //存放元素值
struct DNode * prior; //指向前驱结点
struct DNode * next; //指向后继结点
} DLinkNode; //双链表的结点类型
2.初始化双链表
void InitInitList(DLinkNode * &L)
{
L = (DLinkNode*)malloc(sizeof(DLinkNode));
L->prior = NULL;
L->next = NULL;
}
**判断双链表是否为空**
bool ListEmpty(DLinkNode * L)
{
return (L->next == NULL);
}
3.求双链表的长度
int ListLength(DLinkNode * L)
{
int n = 0;
DLinkNode * p = L;
while (p->next != NULL)
{
n++;
p = p->next;
}
return n;
}
4.头插法创建双链表
void CreateListF(DLinkNode * &L, ElemType a[], int n)
{
DLinkNode * s;
L = (DLinkNode*)malloc(sizeof(DLinkNode)); //创建头节点
L->prior = L->next = NULL; //前后指针域置为NULL
for (int i = 0; i < n; i++) //循环建立数据结点s
{
s = (DLinkNode*)malloc(sizeof(DLinkNode)); //创建结点s
s->data =</