【数据结构】双链表

双链表的增,删,遍历

生成一个节点

这边给出两个方法生成一个节点

第一种方法

生成一个新节点,然后将该节点指针返回,这种方式比较简单,不需要涉及到函数传参的问题

Node* initNode()
{

    Node *l=(Node *)malloc(sizeof(Node));
    if(l==NULL)
    {
        return NULL;
    }
    l->prior=NULL;
    l->next=NULL;
    return l;
};

void main()
{
    Node *start=initNode();
}

第二种方法

即将Node指针的地址传递过来,注意传递的Node指针的地址,不是Node节点的地址,这种方式采用的是二重指针,为什么要采用二重指针,请参考二重指针

void initNode2(Node **p){
    // *p就是真实Node指针的存储单元
    (*p)=(Node *)malloc(sizeof(Node));
    if((*p)==NULL){
        return;
    }
    (*p)->next=NULL;
    (*p)->prior=NULL;

}


void main()
{
    Node *start;
    //&start传递的就是指针的地址
    initNode(&start);

}

个人建议使用第一种方式,对我这种基础薄弱的,指针已经很难理解了,又加了双重指针,有点要命了

遍历

遍历没什么好说的,一直遍历节点next,直到为空停止
该函数传递的是头指针的next,然后进行遍历,不存在空指针的错误

//列表的遍历
Node list(Node *l)
{
    while(l!=NULL)
    {
        printf("%d\n",l->data);
        l=l->next;
    }
}

增加

添加一个节点涉及到四次赋值,分别是将p的next赋给n的next,将p的next的prior赋值为n,这一步可能出现空指针异常,p的next赋值为n,n的prior赋值为p
可能出现空指针异常的地方在p->next->prior这里,即被添加节点的原来的后置节点,因为后置节点可能为空,即被添加的节点是最后一个节点

/**
添加一个节点涉及到四次赋值,分别是将p的next赋给n的next,将p的next的prior赋值为n,这一步可能出现空指针异常,p的next赋值为n,n的prior赋值为p
**/
void add(Node *p,Node *n)
{
    //如果任何一个参数为空直接结束
    if(p==NULL||n==NULL)
        return;
    n->next=p->next;            //将之前在p后的节点添加至n后面
    if(p->next!=NULL)           //判断p->next是否为空 防止出现空指针异常
        p->next->prior=n;
    p->next=n;
    n->prior=p;

}

删除

删除过程就是将删除节点的prior的next修改为删除结点的next,将删除节点的next的prior修改为删除节点的prior
这里不进行头节点的删除,已知除了头结点之外其他节点的prior都不为空,不存在空指针问题
可能出现的空指针异常的是p->next->prior,即被删除的节点可能是最后一个节点,这时删除该节点只需修改前置节点的next即可。别忘记释放资源

//删除一个节点
void delete(Node *p){
    if(p->next!=NULL){
        p->next->prior=p->prior;
    }
    p->prior->next=p->next;
    //释放资源
    free(p);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王不头秃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值