双链表
一、双链表的构成
二、双链表的数据结构
1.预编译部分
#include <stdio.h>
#include <stdlib.h>
2.宏定义部分
#define bool char
#define true 1
#define false 0
3.自定义数据元素类型
typedef int ElemType;
4.双链表结构体定义
typedef struct DNode //定双链表结点类型
{
ElemType data; //每个结点存放一个数据元素
struct DNode* next; //指针指向下一节点
struct DNode* prior; //指针指向上一节点
}DNode, * DLinkList;
5.双链表初始化函数
DLinkList DLinkListInit()
{
//[1]申请空间
DLinkList L = (DLinkList)malloc(sizeof(DLinkList));
//[2]安排指针
L->next = NULL;
L->prior = NULL;
//[3]返回头节点
return L;
}
6.判断双链表是否为空
bool Empty(DLinklist L)
{
if (L->next == NULL)
return true;
else
return false;
}
7.双链表的插入
// 将结点s插入到结点p之后
bool InsertNextDNode(DNode* p, DNode* s)
{
if (p == NULL || s == NULL)
return false;
s->next = p->next;
// 判断结点p之后是否有后继结点
if (p->next != NULL)
p->next->prior = s;
s->prior = p;
p->next = s;
return true;
}
8.双链表的删除
// 删除p结点的后继结点
bool DeletNextDNode(DNode* p)
{
if (p == NULL)
return false;
// 找到p的后继结点q
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;
}
9.销毁一个双链表
bool DestoryList(DLinkList L)
{
// 循环释放各个数据结点
while (L->next != NULL)
{
DeletNextDNode(L);
free(L);
// 头指针置空
L = NULL;
}
}
10.双链表的遍历
1.向后遍历
while (p != NULL)
{
// 对结点p做相应处理
p = p->next;
}
2.向前遍历
while (p != NULL)
{
// 对结点p做相应处理
p = p->prior;
}
3.跳过头结点的遍历
while (p->prior != NULL)
{
//对结点p做相应处理
p = p->prior;
}