单链表的基础上加了一个prior指针,指向前驱节点。
prior前驱指针 | data数据域 | next后驱指针 |
双链表中节点类型:
typedef struct DLNode{
int data;
struct DLNode *prior,*next;
}DLNode,*DLinklist;
初始化双链表
bool InitDlinklist(DLinklist &L){
L=(DLinklist)malloc(sizeof(DLNode));
if(L==NULL){
return false;
//TODO
}
L->next=NULL;
L->prior=NULL;
return true;
}
前插法建立双链表
DLinklist DList_Head(DLinklist &L){
int x;
DLNode *s;
scanf("%d",&x);
while(x!=999){
s=(DLNode*)malloc(sizeof(DLNode));
s->data=x;
s->next=L->next;
s->prior=L;
if(L->next!=NULL){
L->next->prior=s;
//TODO
}
L->next=s;
scanf("%d",&x);
//TODO
}
return L;
}
尾插法建立双链表
DLinklist DList_Tail(DLinklist &L){
int x;
DLNode *s,*r;
s,r=L;
scanf("%d",&x);
while(x!=999){
s=(DLNode*)malloc(sizeof(DLNode));
s->data=x;
r->next=s;
s->prior=r;
r=s;
scanf("%d",&x);
//TODO
}
r->next=NULL;
return L;
}
给定节点后插入
bool InsertNextNode(DLinklist &L,DLNode *p,int e){
DLNode *s =(DLNode*)malloc(sizeof(DLNode));
if(s==NULL){
return false;
//TODO
}
DLNode *q=p->next;
s->data=e;
if(p->next!=NULL){
q->prior=s;
//TODO
}
s->prior=q->prior;
s->next=p->next;
p->next=s;
return true;
}
删除p的后继节点
bool DeleteNextNode(DLNode *p,int &e){
if(p==NULL){
return false;
//TODO
}
if(p->next==NULL){
return false;
//TODO
}
DLNode *q=p->next;
p->next=q->next;
if(q->next!=NULL){
q->next->prior=p;
//TODO
}
e=q->data;
free(q);
return true;
}
遍历双链表
DLNode *p=L;
DLNode *r;
//后向遍历
while(p->next!=NULL){
p=p->next;
//TODO
}
//前向遍历
while(r!=NULL){
r=r->prior;
//TODO
}
//跳过头节点的遍历
while(r->prior!=NULL){
r=r->prior;
//TODO
}