带头双向循环链表

简介: 带头双向循环链表

概述


带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。


双向循环链表含有一个头节点(哨兵位),含有两个指针域,next,prev,分别指向节点的后继和前驱。需要注意的是,头节点的prev指向尾节点,尾节点的next指向头节点

看着复杂,实际操作起来很简单。


初始化


和单链表初始化差不多,无非就是多了一个prev指针

LTNode* CreateLTNode(LTDataType x)
{
  LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
  if (newnode == NULL)
  {
    perror("malloc fail");
    exit(-1);
  }
  newnode->val = x;
  newnode->next = NULL;
  newnode->prev = NULL;
  return newnode;
}
LTNode* LTInit()
{
  LTNode* phead = CreateLTNode(-1);
  phead->next = phead;
  phead->prev = phead;
  return phead;
}


销毁


遍历链表,并定义一个next 来保存 cur 的下一个节点,在链表都free 完后,再销毁头节点;

注意:应该是从头节点的 next 开始遍历。

void ListNodedestroy(LNode* phead)
{
  assert(phead);
  LNode* cur = phead->next;
  while (cur != phead)
  {
    LNode* next = cur->next;
    free(cur);
    cur = next;
  }
  free(phead);
  phead = NULL;
}


插入


找到 pos 的前驱 prev ;

将前驱,pos,新节点链接起来。

void LTInsert(LTNode* pos, LTDataType x)
{
  assert(pos);
  LTNode* posPrev = pos->prev;
  LTNode* newnode = CreateLTNode(x);
  // posprev newnode pos
  posPrev->next = newnode;
  newnode->prev = posPrev;
  newnode->next = pos;
  pos->prev = newnode;
}


删除


找到 pos 的前驱和后继;

链接其前驱,后继;

删除pos。

void LTErase(LTNode* pos)
{
  assert(pos);
  LTNode* posNext = pos->next;
  LTNode* posPrev = pos->prev;
  posPrev->next = posNext;
  posNext->prev = posPrev;
  free(pos);
  //pos = NULL;
}


遍历打印


void LTPrint(LTNode* phead)
{
  assert(phead);
  printf("哨兵位<=>");
  LTNode* cur = phead->next;
  while (cur != phead)
  {
    printf("%d<=>", cur->val);
    cur = cur->next;
  }
  printf("\n");
}
目录
相关文章
|
2天前
带头双向循环链表
带头双向循环链表
21 0
|
7月前
|
存储 算法
数据结构与算法之《带头双向循环链表》详解
数据结构与算法之《带头双向循环链表》详解
40 0
|
2天前
|
C语言 C++
【c++】用c++实现带头双向循环链表
【c++】用c++实现带头双向循环链表
|
9月前
|
存储 缓存
双向带头循环链表+OJ题讲解
实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:
|
2天前
|
存储
带头双向循环链表的实现
带头双向循环链表的实现
|
5月前
|
存储 算法 搜索推荐
双向循环链表
双向循环链表是一种链式存储结构,每个节点包含两个指针,分别指向其前驱和后继。相比于单向链表,双向循环链表在需要频繁插入和删除节点时能够更高效地操作,
21 1
|
6月前
|
Python
循环链表
循环链表是一种链表的变种,它的最后一个节点的指针指向第一个节点,形成了一个环状结构。循环链表的特点包括:可以高效地实现正向和反向遍历,但是插入和删除操作相对较为复杂。
51 6
|
9月前
无头单向不循环链表和带头双向循环链表的创建
接下来我们将会了解最基础的链表--->单链表 以及最方便也是最爽的链表--->带头双向循环链表。
30 0
|
11月前
|
存储
数据结构之链表(带头双向循环链表)
数据结构之链表(带头双向循环链表)
76 0
|
11月前
|
存储
【链表】双向循环链表的实现
【链表】双向循环链表的实现
61 0