前言
单链表的局限性:无法逆向检索,有时候会不太方便,我们在单链表每个结点里增加一个指向其直接前驱的指针域prior,这样就形成了两条方向不同的链,故称为双向链表
双向链表的储存结构
#include <stdio.h>
#define TRUE 1
#define FALSE 0
typedef int DataType;
//双向链表结点类型
typedef struct DNode
{
DataType data;
struct DNode* prior, * next;//前驱和后继指针
}DNode,*DLinkList;
初始化双向链表(带头节点)
//初始化双向链表(带头节点)
bool InitDLinkList(DLinkList& L)
{
L = new DNode;
if (L == NULL)//内存不足,分配失败
{
printf("内存不足,分配失败!\n");
return FALSE;
}
L->prior = NULL;//头结点的prior始终指向NULL
L->next = NULL;//没有后继结点
return TRUE;
}
判断双链表是否为空(带头结点)
//判断双链表是否为空(带头结点)
bool Empty(DLinkList L)
{
if (L->next == NULL)
return TRUE;
else
return FALSE;
}
双向链表尾插法建表
//双向链表尾插法建表
void DList_TailInsert(DLinkList& L)
{
L = new DNode;
L->next = NULL;
L->prior = NULL;
DNode* s, *r;
r = L;
int x;
scanf("%d", &x);
while (1)
{
if (x != 9999)
{
s = new DNode;
s->data = x;
r->next = s;
s->prior = r;
r = s;
scanf("%d", &x);
}
if (x == 9999)
break;
}
r->next = NULL;
}
双向链表头插法建表
//双向链表头插法建表
void DList_HeadInsert(DLinkList& L)
{
L = new DNode;
L->next = NULL;
L->prior = NULL;
DNode* s;
int x;
scanf("%d", &x);
while (1)
{
if (x != 9999)
{
s = new DNode;
s->data = x;