数据结构之单链表(一)介绍了单链表的存储结构和基本操作,数据结构之单链表(二)介绍了其他有关单链表的相关算法,本篇主要介绍双向链表,与单链表不同的是,双向链表中的每个结点都有一个指向前一个结点的指针域,因此双向链表既可以向前之后遍历,也可以从后向前遍历。
一、存储结构
typedef struct DuLNode
{
int data;
struct DuLNode *prior;
struct DuLNode *next;
}DuLNode;
二、基本操作
1、初始化双向链表
int InitDuList(DuLNode *&L)
{
L = (DuLNode*)malloc(sizeof(DuLNode));
if(L == NULL)
return 0;
L->prior = L->next = L;
return 1;
}
2、清空双向链表
void ClearDuList(DuLNode *&L)
{
DuLNode *p, *q;
p= L->next;
while (p != L)
{
q = p->next;
p->next->prior = p->prior;
p->prior->next = p->next;
free(p);
p = q;
}
}
3、销毁双向链表
void DestoryDuList(DuLNode *&L)
{
DuLNode *p, *q;
p = L;
while(p->next != L)
{
q = p->next;
free(p);p=NULL;
p = q;
}
free(p);
}
4、求链表长
int LengthDuList(DuLNode *L)
{
int len = 0;
DuLNode *p = L->next;
while(p != L)
{
len++;
p = p->next;
}
return len;
}
5、指定节点位置插入元素
//在位置i[1, L.length+1]前插入值域为e的结点
int InsertDuList(DuLNode *&L, int i, int e)
{
DuLNode *p, *s;//p指向待插入位置的后一个地方
int j = 1;
p = L->next;
while(p != L && j < i)
{
p = p->next;
j++;
}
if(p == L && j < i || j > i)
return 0;
s = (DuLNode*)malloc(sizeof(DuLNode));
s->data = e;
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return 1;
}
6、指定节点位置删除元素
//删除位置i[1, L.length]的结点
int DeleteDuList(DuLNode *&L, int i, int &e)
{
DuLNode *p;
int j = 1;
p = L->next;
while(p != L && j < i)
{
p = p->next;
j++;
}
if(p == L || j > i)
return 0;
p->next->prior = p->prior;
p->prior->next = p->next;
e = p->data;
free(p);
return 1;
}
7、向后遍历链表
void DuListTraverse_Next(DuLNode *L)
{
DuLNode *p;
p = L->next;
while(p != L)
{
printf("-> %d", p->data);
p = p->next;
}
}
8、向前遍历链表
void DuListTraverse_Prior(DuLNode *L)
{
DuLNode *p;
p = L->prior;
while(p != L)
{
printf("-> %d", p->data);
p = p->prior;
}
}
循环单链表和双向循环链表都是将尾指针指向首元结点。