1、双链表的结点表示:
typedef struct DNode{
ElemType data;
struct DNode *prior,*next;
}DNode,*DLinklist;
2、双链表的初始化操作:
//初始化双链表
bool InitDLinkList(DLinklist &L)
{
L=(DNode *)malloc(sizeof(DNode)); //分配一个头结点
if(L==NULL) //内存不足,申请失败
return false;
L->next=NULL;
L->prior=NULL; //头结点的头指针永远指向NULL
return true;
}
3、双链表的后插操作:
//在p结点之后插入s结点
bool InsertNextDNode(DNode *p,DNode *s)
{
if(p==NULL||s==NULL) //非法参数
return false;
s->next=p->next;
if(p->next!=NULL) //如果p结点之后有结点
{
p->next->prior=s;
}
s->prior=p;
p->next=s;
}
4、双链表的前插操作:
//在p结点之前插入s结点
bool InsertBeforeDNode(DNode *p,DNode *s)
{
if(p==NULL||s==NULL) //非法参数
return false;
DNode *q=p->prior;
s->next=q->next;
p->prior=s;
s->prior=q;
q->next=s;
}
4、双链表的后删操作:
//删除p结点的后继节点
bool DeleteNextDNode(DNode *p)
{
if(p==NULL)
return false;
DNode *q=p->next;
if(q==NULL) //p没有后继
return false;
p->next=q->next;
if(q->next!=NULL) //q不是最后一个结点
{
q->next->prior=p;
}
free(q); //释放q
return true;
}
5、双链表的前删操作:
//删除p结点的前驱结点
bool DeleteBeforeDNode(DNode *p)
{
if(p==NULL)
return false;
DNode *q=p->prior;
q->prior->next=p;
p->prior=q->prior;
free(q);
return true;
}
6、销毁一个双链表:
//销毁一个链表
void DestoryLinkList(DLinklist &L)
{
while(L->next!=NULL)
{
DeleteNextDNode(L);
}
free(L); //释放头结点
L=NULL;
}
7、遍历双链表:(用于按位查找和按值查找,时间复杂度为O(n),由于其不能随机存储)
//遍历操作
while(p!=NULL) //后向遍历
{
p=p->next;
}
while(p!=NULL) //前向遍历
{
p=p->prior;
}
while(p->prior!=NULL) //前向遍历(跳过头结点)
{
p=p->prior;
}