数据结构——线性表的链式存储结构3(双向循环链表)

简介: 数据结构——线性表的链式存储结构3(双向循环链表)

目录

前言

定义

双向循环链表的构建

双向循环链表的初始化

新节点的创建

双向循环链表的尾插

双向循环链表的头插

双向循环链表数据的逐一打印

双向循环链表的尾删

双向循环链表的头删

双向循环链表某数据位置的查找

双向循环链表任意位置的插入

双向循环链表任意位置的删除

前言

在之前讲的链表中,有了头结点时,我们可以用O(1)的时间访问第一个结点,但对于要访问到最后一个结点,却需要O(n)的时间,因此出现了双向链表。

定义

在单链表的每个结点中,在设置一个指向其前驱结点的指针域,最后一个结点又指向头结点,头节点的前驱指针指向最后一个结点,从而构成一个回路。

image.png

双向循环链表的构建

typedef int LTDatype;
typedef struct ListNode
{ 
  struct ListNode* next;//后驱指针
  struct ListNode* prev;//前驱指针
  LTDatype data;
}ListNode;

双向循环链表的初始化

ListNode* ListInit(void)
{
  ListNode* phead = BuyListNode(0);
  phead->next = phead;
  phead->prev = phead;
  return phead;
}

初始化后

image.png

新节点的创建

ListNode* BuyListNode(LTDatype x)
{
  ListNode* newnode = (ListNode*)malloc(sizeof(ListNode));
  newnode->data = x;
  newnode->next = NULL;
  newnode->prev = NULL; 
  return newnode;
}

双向循环链表的尾插

void pushback(ListNode* phead, LTDatype x)
{
  assert(phead);
  ListNode* tail = phead->prev;
  ListNode* newnode = BuyListNode(x);
  tail->next = newnode;
  newnode->prev = tail;
  newnode->next = phead;
  phead->prev = newnode;
}

双向循环链表的头插

void pushfront(ListNode* phead,LTDatype x)
{
  assert(phead);
  ListNode* newnode = BuyListNode(0);
  ListNode* first = phead->next;
  newnode->data = x;
  newnode->next = first;
  newnode->prev = phead;
  first->prev = newnode;
  phead->next = newnode;
}

双向循环链表数据的逐一打印

void ListPrint(ListNode*phead)
{
  ListNode* cur = phead->next;
  while (cur!= phead)
  {
    printf("%d ", cur->data);
    cur = cur->next;
  }
  printf("\n");
}

双向循环链表的尾删

void popback(ListNode* phead)
{
  assert(phead);
  assert(phead->next != phead);
  ListNode* tail = phead->prev;
  ListNode* tail2 = tail->prev;
  phead->prev = tail2;
  tail2->next = phead;
  free(tail);
}

双向循环链表的头删

void popfront(ListNode* phead)
{
  assert(phead);
  assert(phead->next != phead);
  ListNode* first = phead->next;
  ListNode* second = first->next;
  phead->next = second;
  second->prev = phead;
  free(first);
}

双向循环链表某数据位置的查找

ListNode* ListFind(ListNode* phead, LTDatype x)
{
  assert(phead);
  ListNode* cur = phead->next; 
  while (cur != phead)
  {
    if (cur->data == x)
    {
      return cur;
    }
    cur = cur->next;
  }
  return NULL;
}

双向循环链表任意位置的插入

void ListInsert(ListNode* pos, LTDatype x)
{
  assert(pos);
  ListNode* prev = pos->prev;
  ListNode* newnode = BuyListNode(0);
  newnode->data = x;
  newnode->next = pos;
  prev->next = newnode;
  newnode->prev = prev;
  pos->prev = newnode;
}

双向循环链表任意位置的删除

void ListErase(ListNode* pos)
{
  assert(pos);
  ListNode* next = pos->next;
  ListNode* prev = pos->prev;
  next->prev = prev;
  prev->next = next;
  free(pos);
}
相关文章
|
6月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
275 5
|
8月前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
310 16
|
9月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
10月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。
207 6
|
10月前
|
存储 机器学习/深度学习 C语言
数据结构基础详解(C语言): 树与二叉树的基本类型与存储结构详解
本文介绍了树和二叉树的基本概念及性质。树是由节点组成的层次结构,其中节点的度为其分支数量,树的度为树中最大节点度数。二叉树是一种特殊的树,其节点最多有两个子节点,具有多种性质,如叶子节点数与度为2的节点数之间的关系。此外,还介绍了二叉树的不同形态,包括满二叉树、完全二叉树、二叉排序树和平衡二叉树,并探讨了二叉树的顺序存储和链式存储结构。
142 3
|
9月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
9月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
109 2