双链表的创建插入删除带注释

C语言的双链表

#include<stdio.h>
#include<stdlib.h>
typedef struct DNode{
int Data;
DNode *prior,*next;
}DNode,DLinkList;
bool InitDLinkList(DLinkList &L) //初始化双链表
{
L=(DNode
)malloc(sizeof(DNode));
if(LNULL){
printf(“内存不足,创建双链表失败\n”);
return false;
}
L->next=NULL; //后驱结点为空
L->prior=NULL; //前驱结点为空
return true;
}
bool InsertNextDLinkList(DNode *p,DNode *q)//在p结点之后插入q结点
{
if(p
NULL||qNULL){ //增强代码健壮性 判断p结点和q结点是否为空
return false;
}
//先处理插入节点和后继结点的关系
q->next=p->next; //不管p是否为当前双链表的最后一个结点(下一个结点是否为空),这一步都会执行
if(p->next!=NULL) { //判断p是否为当前双链表的最后一个结点(下一个结点是否为空) 如果不是空的,要多执行一步,把后面结点的前指针指向要插入的结点
p->next->prior=q;
}
//处理完插入结点与后结点的关系,处理插入结点和前驱结点的关系
p->next=q; //p的后指针指向q
p=q->prior; //q的前指针指向p
return true;
}
bool InsertFrontDLinkList(DNode *p,DNode *q){ //常规前插操作
if(p
NULL||qNULL){ //增强代码健壮性 判断p结点和q结点是否为空
return false;
}
p->prior->next=q;
p->prior=q->prior;
p=q->next;
q=p->prior;
return true;
}
bool InsertFDLinkList(DNode *p,DNode *q){ //调用后插操作的前插操作
DLinkList s=p->prior; //选中p指针的前一个结点
InsertNextDLinkList(s,q); //对p指针的前一个结点进行后插操作
}
bool DeleteDLinkList(DNode *p) //删除p结点
{
if(p
NULL){ //增强代码的健壮性
return false;
}
p->prior->next=p->next; //参考在p结点后插入指针
if(p->next!=NULL){
p->prior=p->next->prior;
}
printf(“已删除%d\n”,p->Data);
free§;
return true;
}
bool DeleteBehindDLinkList(DNode *p) //删除p结点的后继结点
{
if(p->nextNULL) //增强代码健壮性,先判断p结点后有没有后继结点,没有后继节点就不能使用删除p结点后继结点的方法
{
printf(“p结点无后继结点\n”);
return false;
}
DNode *q; //定义哨兵指针
q=p->next; //令哨兵指针指向删除结点
DeleteDLinkList§; //此时哨兵指针指向的结点就是要删除的结点,因此直接调用删除指定结点的方法即可
return true;
}
bool DeleteFrontDLinkList(DNode *p) //删除p结点的前驱结点
{
if(p->next
NULL) //增强代码健壮性,先判断p结点后有没有前驱结点,没有后继节点就不能使用删除p结点前驱结点的方法
{
printf(“p结点无后继结点\n”);
return false;
}
DNode *q;
p=p->prior; //注释参考删除p结点的后继结点注释
DeleteDLinkList§;
return true;
}
bool ClearDLinkList(DLinkList L) //删除该双链表
{
while(L->next!=NULL) //只要头结点的下一个结点还有,就执行删除结点的操作
{
DeleteDLinkList(L->next);
}
free(L); //删除完所有节点后,释放头结点
printf(“已删除双链表”);
return true;
}
bool ReadLinkList(DNode *p){ //给定指针找到该指针的数据
if(p==NULL)
{
printf(“没有该指针”);
return false;
}
printf("%d",p->Data);
return true;
}
int main()
{
DLinkList L;
DNode *p;
InsertNextDLinkList(L,p);
system(“pause”);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值