1.1双向带头结点非循环链表
1.2双向带头结点循环链表
2.1创建节点信息的结构体
2.2初始化/创建头结点
2.3双链表节点的插入
2.4双链表的删除
双链表的节点指针域有两个指针,一个指向前面,一个指向后面。不同于单链表,单链表的指针域只有一个指针指向后面,那么当需要寻找前面的指针时,就很不方便。
1.1双向带头结点非循环链表,双向链表一定要记得将前指针向前指
1.2双向带头结点循环链表
2.1创建节点信息的结构体
//双向链表结点设计
typedef struct node
{
int data;//数据段
struct node *next;//后向指针
struct node *prev;//前向指针
}ND, *PND;
2.2初始化/创建头结点
a、双向带头结点非循环链表
/***********************************
功能:初始化/创建带头结点的双向非循环链表
参数:void
返回值:返回一个PND类型的头结点
*************************************/
PND init_double_link(void)
{
PND phead;
phead=(PND)malloc(sizeof(ND));
if(phead == NULL)
{
printf("malloc fail\n");
return NULL;
}
phead->next = NULL;
phead->prev = NULL;
return phead;
}
b、双向带头结点循环链表
/***********************************
功能:初始化/创建带头结点的双向循环链表
参数:void
返回值:返回一个PND类型的头结点
*************************************/
PND init_double_cir_link(void)
{
PND phead;
phead=(PND)malloc(sizeof(ND));
if(phead == NULL)
{
printf("malloc fail\n");
return NULL;
}
phead->next = phead;
phead->prev = phead;
return phead;
}
2.3双链表节点的插入
1234的顺序中,其中34是不可以调换顺序的,因为如果先进行4,那么phead->next这个节点就无法表示。
/***********************************
功能:插入新结点都头结点后面
参数:phead 插入链表的头结点 d插入该结点的数据
返回值:true插入成功 false 插入失败
*************************************/
bool insert_node_head(PND phead, int d)
{
//判断phead是否有效
if(phead == NULL)
{
printf("disable reached!\n");
return false;
}
PND pnew = (PND)malloc(sizeof(ND));
//判断是否申请成功
if(pnew == NULL)
{
printf("malloc pnew failed!\n");
return false;
}
//判断插入的节点是否第一个
if(phead->next == NULL)
{
pnew->prev = phead;
pnew->next =NULL;
phead->next = pnew;
}
else
{
pnew->next = phead->next;
pnew->prev = phead;
phead->next->prev = pnew;
phead->next = pnew;
}
pnew->data = d;
return true;
}
2.3双链表节点的删除
/***********************************
功能:删除数据域为d的节点
参数:phead 删除链表的头结点 d删除该结点的数据
返回值:true插入成功 false 插入失败
*************************************/
bool delete_node(PND phead, int d)
{
//判断phead是否有效
if(phead == NULL)
{
printf("disable reached!\n");
return false;
}
PND pdel = phead->next;//由于phead随机,如刚好那么巧,头就被删掉了
//查找要删除的那个结点
while(pdel != NULL)
{
if(pdel->data== d)//找到了
{
if(pdel->next == NULL)
{
pdel->prev->next = NULL;
pdel->next = NULL;
pdel->prev = NULL;
break;
}
pdel->prev->next = pdel->next;
pdel->next->prev = pdel->prev;
pdel->next = NULL;
pdel->prev = NULL;
break;
}
pdel = pdel->next;
}
return true;
}