1. 双链表
双链表就是在单链表的基础上又增加了一个头结点prior
typedef struct DNode{//定义单链表结点类型
ElemType data;//数据域,存放数据
struct DNode *prior,*next;//指针域
}DNode,*DLinkList;
//初始化双链表
bool InitDList(DLinkList &L){
L=(DLNode *)malloc(sizeof(DLNode));//分配一个头结点
if (L==NULL)//内存不足,分配失败
return false;
L->prior=NULL;//头结点的prior永远指向NULL
L->next=NULL;//头结点之后暂时还没结点,即为空表
return true;
}
void testDLinkList(){
DLinkList L;//声明一个指向单链表的指针
//初始化一个空表
InitDLinkList(L);
//后续代码...
}
1.1 插入
//在p后面插入s
s->next=p->next;
p->next->prior=s;
p->next=s;
s->prior=p;
时间复杂度O(1)
1.2 删除
//删除p的后继结点q
bool DeleteNextNode(DNode *p){
if(p==null)
return false;
DNode *q=p->next;//找到p的后继结点q
if(q==null)
return false;//p没有后继结点
p->next=q->next;
if(q->next!=null)
q->next->prior=p;
free(q); //释放结点空间
return true;
}
时间复杂度O(1)
1.3 遍历
while(p!=null){//后向遍历
p=p->next;
}
while(p!=null){//前向遍历
p=p->prior;
}