/*双链表:(单链表无法逆向检索)
特点:不可随机存取,按位查找,按值查找操作都只能用遍历的方式实现。O(n)
*/
#include <bits/stdc++.h>
using namespace std;
typedef struct DNode
{
int data;
struct DNode *prior,*next;//前驱和后继指针
} Dnode,*DLinkList;
//初始化双链表
bool InitDLinkList(DLinkList &L)
{
L=(DNode *)malloc(sizeof(DNode));//分配一个头结点
if(L==NULL)//内存不足,分配失败
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;
}
//双链表的插入(4步)
bool InsertNextNode(DNode *p,DNode *s) //在p结点之后插入s结点
{
if(p==NULL||s==NULL)
return false;
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
//双链表的删除
bool DeleteNextDNode(DNode *p) //删除p结点的后继结点
{
if(p==NULL)
return false;
DNode *q=p->next;//找到p的后继结点
if(q==NULL)
return false;
p->next=q->next;
if(q->next!=NULL)
q->next->prior=p;
free(q);
return true;
}
//销毁双链表
void DestoryList(DLinkList &L)
{
while(L->next!=NULL)
DeleteNextDNode(L);
free(L);//释放头结点
L=NULL;//头指针指向NULL
}
int main()
{
DLinkList L;
InitDLinkList(L);
//后向遍历
while(L!=NULL)
{
//对结点L做相应处理,如打印
L=L->next;
}
//前向遍历
while(L!=NULL)
{
//对结点L做相应处理,如打印
L=L->prior;
}
//前向遍历(跳过头结点)
while(L->prior!=NULL)//L->prior==NULL表示已经是头结点了
{
//对结点L做相应处理,如打印
L=L->prior;
}
return 0;
}
数据结构-双链表
最新推荐文章于 2024-07-18 17:57:16 发布