双链表
结构体
typedef struct DNode { /* 定义双链表结点类型 */
ElemType data; /* 数据域 */
struct DNode *prior,*next; /* 前驱和后继指针 */
}DNode, *DLinklist;
双链表的初始化(带头结点)
/* 初始化双链表 */
bool InitDLinklist(DLinklist &L) {
L = (DNode *)malloc(sizeof(DNode)); /* 分配一个头结点 */
if (L == NULL) return false; /* 内存不足,分配失败 */
L->prior = NULL; /* 头结点的prior永远指向NULL */
L->next = NULL; /* 头结点之后暂时还没有结点 */
return true;
}
/* 判断双链表是否为空(带头结点) */
bool Empty(DLinklist L) {
return L->next == NULL;
}
双链表的插入
/* 在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;
return true;
}
双链表的删除
/* 删除p结点的后继结点*/
bool DeleteNextDNode(DNode *p) {
if (p == NULL)
return false;
DNode *q = p->next;
if (q == NULL)
return false;
p->next = q->next;
if (q->next != NULL)
q->next->prior = p;
free(q);
return true;
}
双链表的遍历
/* 后向遍历 */
while(p != NULL) {
/* 对节点p做相应处理,如打印 */
p = p->next;
}
/* 前向遍历 */
while(p != NULL) {
/* 对节点p做相应处理,如打印 */
p = p->prior;
}
/* 前向遍历 (跳过头结点*/
while(p->prior != NULL) {
/* 对节点p做相应处理,如打印 */
p = p->prior;
}