《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

简介: 《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)

前言


提示:本系列文章均使用Visual Studio 2019编程,编程语言为c语言。


一、循环链表


(一)定义


将单链表的终端结点的指针端由空指针改为指向头结点,这样就让整个单链表形成一个循环,这时头尾相连的单链表就称为单循环链表,即循环链表,下图的head,即为头指针。

1666885707296.jpg

将循环链表和单链表相比较,其实就在循环的判断条件上差别,单链表判断是否为空(p!=null 或 p->null!=null),循环链表是否等于头结点(p!=head 或 p->next!=head)。


(二)尾指针


事实上我们不用头指针,而改用指向终端结点的尾指针来表示循环链表,这样就使查找开始结点和终端结点就很方便。

1666885754196.jpg

我们通过一张图,进一步了解其尾指针的作用:

1666885763803.jpg


二、双向链表


(一)定义


在单链表结构中,结点只有一个指向后继的指针域next,若要查找某个结点只能顺着单链表寻找它的后继结点,为了能够高效地查找一个结点,我们只需从头指针出发查找其前驱,即我们增加一个指向其直接前驱的指针域prior,这样我们就构成了一个双向链表。其中第一个结点的前趋结点为NULL,最后一个结点的后继结点也为NULL。

指针域(prior) 数据域 指针域(next)

即,数据域为data数据,存储一个数据元素的信息;prior指针域为前驱指针域,用于存储其直接前驱存储地址的信息;next指针域为后继指针域,用于存储其后继存储地址的信息。


(二)代码


1.双向单链表的建立

分别定义数据域,前驱指针域以及后继指针域。

typedef char DataType;
typedef struct dunode
{
  DataType data;         //数据域
  struct dunode *prior;   //前驱指针域
  struct dunode *next;    //后继指针域
}DuLinkList;

2.双向单链表的插入

若要将新结点s(x为其值)插入到双向链表中两个结点o、p之间,即在p结点之前插入结点s,首先我们应该将要插入的新结点s的前驱指针域指向结点p的前一个结点o,将结点o的后继指针域指向要插入的新结点s,然后将结点s的后继指针域指向p结点,并将结点p的前驱指针域指向结点s。

void InsertList(InsertElem *p,DataType x)
{
   InsertElem *s;
   s=(InsertElem *)malloc(sizeof(InsertElem));  //生成新结点s
   s->data=x;
   s->prior=p->prior;     //也可写成s->prior=o
   p->prior->next=s;      //也可写成o->next=s
   s->next=p;
   p->prior=s;            //也可写成o=s
}

3.双向链表的删除

若要删除表中的结点p,我们首先应该将结点p的前一个结点的后继指针域指向结点p的后继指针域,将结点p后一个结点的前驱指针域指向结点p的后继指针域,然后释放结点p的空间。

void DeleteElem(DeleteList *p,DataType *x)
{
  *x=p->data;
  p->prior->next=p->next;
  p->next->prior=p->prior;
  free(p);
}


总结


以上就是本次的笔记内容,本文介绍了循环链表、双向链表的各项操作,笔记若有错误,还望指出!!!


相关文章
|
28天前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
45 1
|
1月前
|
存储 算法 搜索推荐
【趣学C语言和数据结构100例】91-95
本文涵盖多个经典算法问题的C语言实现,包括堆排序、归并排序、从长整型变量中提取偶数位数、工人信息排序及无向图是否为树的判断。通过这些问题,读者可以深入了解排序算法、数据处理方法和图论基础知识,提升编程能力和算法理解。
49 4
|
1月前
|
存储 机器学习/深度学习 搜索推荐
【趣学C语言和数据结构100例】86-90
本文介绍并用C语言实现了五种经典排序算法:直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序。每种算法都有其特点和适用场景,如直接插入排序适合小规模或基本有序的数据,快速排序则适用于大规模数据集,具有较高的效率。通过学习这些算法,读者可以加深对数据结构和算法设计的理解,提升解决实际问题的能力。
45 4
|
1月前
|
存储 算法 数据处理
【趣学C语言和数据结构100例】81-85
本文介绍了五个经典算法问题及其C语言实现,涵盖图论与树结构的基础知识。包括使用BFS求解单源最短路径、统计有向图中入度或出度为0的点数、统计无向无权图各顶点的度、折半查找及二叉排序树的查找。这些算法不仅理论意义重大,且在实际应用中极为广泛,有助于提升编程能力和数据结构理解。
45 4
|
1月前
|
算法 数据可视化 数据建模
【趣学C语言和数据结构100例】76-80
本文介绍了五种图论算法的C语言实现,涵盖二叉树的层次遍历及广度优先搜索(BFS)和深度优先搜索(DFS)的邻接表与邻接矩阵实现。层次遍历使用队列按层访问二叉树节点;BFS利用队列从源节点逐层遍历图节点,适用于最短路径等问题;DFS通过递归或栈深入图的分支,适合拓扑排序等场景。这些算法是数据结构和算法学习的基础,对提升编程能力和解决实际问题至关重要。
52 4
|
1月前
|
存储 算法 vr&ar
【趣学C语言和数据结构100例】71-75
本文介绍了五个C语言数据结构问题及其实现,涵盖链表与二叉树操作,包括按奇偶分解链表、交换二叉树左右子树、查找节点的双亲节点、计算二叉树深度及求最大关键值。通过递归和遍历等方法,解决了理论与实际应用中的常见问题,有助于提升编程能力和数据结构理解。
43 4
|
1月前
|
存储 算法 C语言
【趣学C语言和数据结构100例】66-70
本书《趣学C语言和数据结构100例》精选了5个典型的数据结构问题及C语言实现,涵盖链表与数组操作,如有序集合的集合运算、有序序列表的合并、数组中两顺序表位置互换、三递增序列公共元素查找及奇偶数重排。通过详细解析与代码示例,帮助读者深入理解数据结构与算法设计的核心思想,提升编程技能。
36 4
|
1月前
|
存储 算法 C语言
【趣学C语言和数据结构100例】51-55
本文介绍了五个关于链表操作的C语言实现案例,包括删除单链表中的重复元素、从两个有序链表中查找公共元素、判断一个链表是否为另一链表的连续子序列、判断循环双链表是否对称及合并两个循环单链表。每个案例都详细解析了算法思路与实现方法,涵盖了链表操作的多种场景,旨在帮助读者深入理解链表数据结构的应用,提升算法设计与编程能力。
43 4
|
26天前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
278 6
|
29天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
55 5