数据结构与算法第三讲-[双向链表]

本文介绍了双向链表的概念,对比单向链表指出其优势。详细阐述了双向链表的节点创建、插入、删除操作,包括边界条件处理和具体步骤。此外,还提到了双向循环链表的特性和插入方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据结构与算法.jpg
#双向链表
单向链表相对数组来说已经有很多优点了,但是,它还有一个最大的弊端,那就是在某种程度上和深度优先遍历有通性.一条路走到黑,从不回头!这种特性在进行数据操作时,会大大浪费时间,鉴于此,出现了双向链表的概念。
顾名思义,双向链表就是具备两个方向的指向,无非就是每个结点成了两个指针。
每次在插入或删除某个节点时, 需要处理四个节点的引用, 而不是两个. 也就是实现起来要困难一些 . 一个节点既有向前连接的引用, 也有一个向后连接的引用.
双向链表的节点结构图.png

创建结点

//定义结点
typedef struct Node{
    ElemType data;
    struct Node *prior;
    struct Node *next;
}Node;
typedef struct Node * LinkList;

非空双向链表结构.png

• 创建双向链表

  1. 初始化头结点信息*L的前驱以及后继
  2. 创建新的临时节点
  3. 为新增的节点建立依赖关系
    图片.png
/* 双向链表的创建  */
Status  creatDoubleLinkList(linkList * L){
    
    *L = (linkList)malloc(sizeof(Node));
    if (*L == NULL) return ERROR ;
    
    (*L)->data  = -1 ;
    (*L)->prior = NULL;
    (*L)->next  = NULL;
    
    /* 新增数据 */
    
    linkList p = *L ;
    for (int i = 0; i<10; i++) {
        
        /* 创建临时结点 */
        linkList temp = (linkList)malloc(sizeof(Node));
        if (temp == NULL) return ERROR;
        temp->data = i ;
        temp->prior = NULL ;
        temp->next = NULL;
        
        
        /* 建立依赖关系 */
        p->next = temp;
        temp->prior = p ;
        p = p->next;
        
    }
    return OK;
}

• 插入

  1. 边界条件的判断
  2. 新建结点temp,对它进行赋值prior\next = NULL data = data
  3. 方便书写。新建一个LinkList p = *L;
  4. 找到需要插入数据的前一个位置
  5. 判断插入的位置是否是链表的尾部
  6. 尾部和非尾部的两种处理
  7. 非尾部插入
      7.1 把需要插入节点的节点的prior指向新创建的节点 p->next->prior = temp;
      7.2 将temp的next指向 要插入的位置的节点,temp->next = p->next;
      7.3 将原来的p->next指向新创建的节点temp p->next = temp;
      7.4 新创建的节点temp的前驱更新为片
    (1、2的先后顺序可以互换,3、4的执行顺序也可以互换,但是必须要保证12在34之前执行,防止丢掉后面的节点)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值