一个结点包含指向后继(next)和指向前驱(prior)两个指针,两个方向又分别构成循环链表。
双链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增加一个指向其直接前驱的指针域
删除结点时
双链表可以自由的访问该结点的前驱后继
在做插入结点或删除结点时还是要考虑是否是第一个结点或是最后一个结点
哨兵结点是个哑对象,可以简化边界条件
//定义节点的结构
typedef struct _node{
void *data; //数据域
struct _node *pior; //前驱
struct _node *next; //后继
}NODE;
//定义链表的结构
typedef struct{
NODE *head; //头指针
NODE *last; //尾指针
int length; //长度
}LIST;
删除一个结点
//打印双链表的元素带分页
void PrintList(LIST *l,int page,int preP,void (*printNode)(void *)){
int start,end,i;
NODE *p=NULL;
if(l==NULL||printNode==NULL)
return;
start=(page-1)*preP+1;
end=page*preP;
p=l->head->next;
i=0;
while(i<l->length&&p->next!=NULL){
i++;
if(i==start) break;
p=p->next;
}
for(;i<=end&&p->next!=NULL;i++){
printNode(p->data);
p=p->next;
}
}
完整源码下载地址:https://github.com/sunjdk/datastructure/tree/master/doubleLinkedList