双链表的定义
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;
}
双链表的插入(后插)
//在p结点之后插入s结点
bool InsertNextNode(DNode* p, DNode* s) {
if (p == NULL || s == NULL) //非法参数
return false;
s->next = p->next; //①将结点*s插入到结点*p之后
if (p->next != NULL) //如果p结点有后继结点
p->next->prior = s; //②
s->prior = p; //③
p->next = s; //④
return true;
}
按位序插入和前插操作都可以转化为后插操作
双链表的删除
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结点不是最后一个结点
q->next->prior = p; //②
free(q); //释放结点空间
return true;
}
销毁双链表
void DestoryList(DLinklist& L) {
//循环释放各个数据结点
while (L->next != NULL)
DeleteNextNode(L);
free(L); //释放头结点
L = NULL; //头指针指向NULL
}
双链表的遍历
后向遍历
while (p != NULL) {
//对结点p做相应处理,如打印
p = p->next;
}
前向遍历
while (p != NULL) {
//对结点p做相应处理
p = p->prior;
}
跳过头结点
while (p->prior != NULL) {
//对结点p做相应处理
p = p->prior;
}
双链表不可随机存储,时间复杂度O(n)
主函数
void testLinkList() {
//初始化双链表
DLinklist L;
InitDLinkList(L);
......
}