链表之双向

  我们运用了单向链表来解决一些问题,但在解决那些需要大量查找前趋节点的问题是,单向链表无疑是不能用了,因为单向链表适合“从前往后”查找,并不适合“从后往前”查找。

        如果要提高链表的查找效率,那双向链表(双链表)无疑是首选。

一:创建

line* initLine(line* h){
    h = (line*)malloc(sizeof(line)); // 创建链表第一个结点
    h->prior = NULL;
    h->next = NULL;
    h->data = 1;
    line *l = h;
    for(int i = 2; i <= 3; i++)
    {
        // 创建并初始化一个新结点
        line *b = (line*)malloc(sizeof(line));
        b->prior = NULL;
        b->next = NULL;
        b->data = i;
 
        l->next = b; // 直接前结点的next指针指向新结点
        b->prior = l; // 新结点指向直接前结点
        l = l->next;
    }
    return h;
}

二:插入新节点

添加节点
        添加节点可以分为三种,分别是:添加至表头、添加至链表的中间位置和添加至链表尾。

  将新元素添加到表头:

        假设定义新元素节点为t,表头节点为h,则只需要执行下面两个步骤和即可:

  1. t的next变成h,h的prior编程t;
  2. 将head移至tmp,重新指向新的表头。

添加至表的中间位置主要分为两个步骤:

  1. 新节点先与其后继节点建立关系;
  2. 新节点的前驱与之建立关系.

  表未与添加至表头差不多:

  1. 找到双向链表的最后一个节点;
  2. 让新节点与其建立关系。
line* insertLine(line* h, int data, int add){
    // 新建数据域为data的结点
    line *t = (line*)malloc(sizeof(line));
    t->data = data;
    t->prior = NULL;
    t->next = NULL;
    if(add == 1)
    {
        t->next = h;
        h->prior = t;
        h = t;
    }
    else
    {
        line *b = h;
        // 找到要插入位置的前一个结点
        for(int i = 1; i < add - 1; i++)
        {
            b = b->next;
        }
        // 判断条件为真,说明插入位置为链表尾
        if(b->next == NULL)
        {
            b->next = t;
            t->prior = b;
        }
        else
        {
            b->next->prior = t;
            t->next = b->next;
            b->next = t;
            t->prior = b;
        }
    }
    return h;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值