数据结构----双向链表(循环和非循环)

本文介绍了双向链表的基本概念,包括带头结点和不带头结点的双向链表,以及循环双向链表的存储结构、初始化、扩充、插入、删除、打印和销毁等操作。重点讨论了双向链表中如何维护前驱和后继指针,以及在操作时的注意事项。
摘要由CSDN通过智能技术生成

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点,一般分为带头结点双向链表,和不带头结点(带头指针)双向链表(多用做循环双向链表) 。

1.带头结点的双向链表(有两个指针域,一个指向它的前驱,一个指向它的后继)

(1)、双向链表的存储结构

双向链表和单链表的区别在于双向链表除了与单链表具有相同的数据域和next域之外,有一个指向前驱的prev域,双向链表中头结点的前驱指向空,尾结点的后继指向空。

typedef int ElemType;
 
 
typedef struct Node
{
    struct Node *prev;
    ElemType  data;
    struct Node *next;
}Node;
 
typedef struct DoubleList
{
    Node head;
    int count;
}DoubleList, *pDoubleList;

 

(2)、双向链表的初始化

void InitDoubleList(pDoubleList list)
{
    assert(list != NULL);
 
    list->count = 0;
    list->head.next = list->head.prev = NULL;
}


(3)、双向链表的扩充

static Node *BuyNode(ElemType val, Node *prev, Node *next)
{
    Node *s = (Node *)malloc(sizeof(Node));
    assert(s != NULL);
 
    s->data = val;
    s->next = next;
    s->prev = prev;
 
    return s;
}

(4)双向链表的插入

双向链表有一个next域域prev域,所以我们需要将创建的结点的prev域指向前一个结点,next域指向后一个

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值