数据结构——线性表的链式存储结构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);
}
相关文章
|
26天前
|
存储 搜索推荐 算法
【数据结构】树型结构详解 + 堆的实现(c语言)(附源码)
本文介绍了树和二叉树的基本概念及结构,重点讲解了堆这一重要的数据结构。堆是一种特殊的完全二叉树,常用于实现优先队列和高效的排序算法(如堆排序)。文章详细描述了堆的性质、存储方式及其实现方法,包括插入、删除和取堆顶数据等操作的具体实现。通过这些内容,读者可以全面了解堆的原理和应用。
63 16
|
2月前
|
存储 安全 数据库
除了 HashMap,还有哪些数据结构可以实现键值对存储?
【10月更文挑战第11天】 除了`HashMap`,其他常见支持键值对存储的数据结构包括:`TreeMap`(基于红黑树,键有序)、`LinkedHashMap`(保留插入顺序)、`HashTable`(线程安全)、`B-Tree`和`B+Tree`(高效存储大量数据)、`SkipList`(通过跳跃指针提高查找效率)及`UnorderedMap`(类似`HashMap`)。选择合适的数据结构需根据排序、并发、存储和查找性能等需求。
|
3月前
|
存储 Java
java数据结构,线性表链式存储(单链表)的实现
文章讲解了单链表的基本概念和Java实现,包括头指针、尾节点和节点结构。提供了实现代码,包括数据结构、接口定义和具体实现类。通过测试代码演示了单链表的基本操作,如添加、删除、更新和查找元素,并总结了操作的时间复杂度。
java数据结构,线性表链式存储(单链表)的实现
|
2月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
2月前
|
存储
[数据结构] -- 双向循环链表
[数据结构] -- 双向循环链表
24 0
|
2月前
探索顺序结构:栈的实现方式
探索顺序结构:栈的实现方式
|
2月前
|
存储 算法
【数据结构】二叉树——顺序结构——堆及其实现
【数据结构】二叉树——顺序结构——堆及其实现
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
438 8
|
2月前
|
存储
【初阶数据结构】深入解析带头双向循环链表:探索底层逻辑
【初阶数据结构】深入解析带头双向循环链表:探索底层逻辑
|
3月前
|
存储 算法 C语言
数据结构基础详解(C语言): 二叉树的遍历_线索二叉树_树的存储结构_树与森林详解
本文从二叉树遍历入手,详细介绍了先序、中序和后序遍历方法,并探讨了如何构建二叉树及线索二叉树的概念。接着,文章讲解了树和森林的存储结构,特别是如何将树与森林转换为二叉树形式,以便利用二叉树的遍历方法。最后,讨论了树和森林的遍历算法,包括先根、后根和层次遍历。通过这些内容,读者可以全面了解二叉树及其相关概念。