定义和初始化
//双链表的定义
typedef struct DNode{
int e;
struct DNode *prior,*next;
}DNode,*DLinkList;
//初始化双链表——带头结点
bool InitDLinkList(DLinkList &L){
L=(DNode *)malloc(sizeof(DNode)*1);//头结点
//内存分配失败
if(L==NULL)
return false;
L->prior=L->next=NULL;
return true;
}
//初始化双链表——带头结点
bool InitDLinkList(DLinkList &L){
L=(DNode *)malloc(sizeof(DNode)*1);//头结点
//内存分配失败
if(L==NULL)
return false;
L->prior=L->next=NULL;
return true;
插入、删除、判空和遍历
//双链表——判空
bool Empty(DLinkList L){
//只判断L->next是否为空就好
if(L->next==NULL)
return true;
else
return false;
}
//双链表的插入——在结点p之后插入结点s
bool InsertNextNode(DNode *p,DNode *s){
//1
s->next=p->next;
//注意判断语句是第二步
//2
if(p->next!=NULL)//加一句判断,避免p后面的空指针错误
//如果p是双链表最后一个结点,不需要这句代码
p->next->prior=s;
//3
s->prior=p;
//4
p->next=s;
//注意步骤1和4不能换顺序,否则s的指针会指向自身
return true;
}
//双链表的删除——带头结点
//循环删除表头结点的后继结点,直至只剩头结点,最后释放头结点,让头指针指向空
bool DestoryList(DLinkList &L){
//循环删除表头结点的后继结点
while(L->next!=NULL)//不带头结点时改为L!=NULL
DeleteNextDNode(L);
free(L);//释放头结点
L=NULL;//头指针指向空
}
//删除p结点的后继结点
bool DeleteNextDNode(DNode *p){
if(p==NULL)
return false;
//用指针标记p的后继结点
DNode *q=p->next;
p->next=q->next;
if(q!=NULL)//p不是链表中的最后一个结点,存在p的后继结点q
q->next->prior=p;
free(q);
return true
}
//双链表的遍历
//1 向后遍历
while(p->next!=NULL){
p=p->next;
}
//2 向前遍历——跳过头结点
while(p->prior!=NULL){
p=p->prior;
}
//3 向前遍历
while(p!=NULL){
p=p->prior;
}