首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言链表,循环链表,静态链表讲解(王道版)

目录 一、链表 初始化(带头结点): 链表的插入: 链表的遍历  循环链表  循环单链表的初始化 循环链表的初始化 链表的插入 链表的删除 静态链表 定义静态链表 插入 删除 ---- 一...、链表 在单链表中,每个元素都附加了一个指针域,指向下一个元素的存储位置。...初始化(带头结点): typedef struct DNode{ //定义链表结点类型 Elemtype date; //数据域 struct...DNode *prior,*next; //前驱和后继指针 }DNode,*DLinklist; //初始化链表 bool InitDLinkList(DLinklist &L){ L =...=NULL) { //对结点p做相应的处理 p = p-> prior; } 链表不可随机存取,按位查找和按值查找都只能用遍历的方式实现。

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

C语言】探索数据结构:单链表链表

链表的概念和结构 概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。...也可能不连续 链表的分类 虽然说有8种链表结构,但是现实中主要使用的只有两种结构: 无头单向非循环链表:结构简单,一般不会单独用来存数据。...带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都 是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带 来很多优势,实现反而简单了。...无头单向非循环链表(单链表)的实现 定义节点结构 用 typedef 重定义要保存的数据类型,方便修改,灵活处理 节点之间用指针相连,每一个节点都会保存下一个节点的地址,指向下一个节点 //定义链表节点的结构...带头双向循环链表是双向链表的一种特殊形式,它有以下特点: 带头:链表中有一个头节点,它不存储实际数据,只用于标识链表的起始位置。

9010

链表逆序

2、 单链表逆序 第二个题目是很经典的“单链表逆序”问题。...如何在不使用额外存储节点的情况下使一个单链表的所有节点逆序?我们先用迭代循环的思想来分析这个问题,链表的初始状态如图(1)所示: ?...首先从A节点开始逆序,将A节点的next指针指向prev,因为prev的当前值是NULL,所以A节点就从链表中脱离出来了,然后移动head和next指针,使它们分别指向B节点和B的下一个节点C(因为当前的...()对问题进行求解,将链表分为当前表头节点和其余节点,递归的思想就是,先将当前的表头节点从链表中拆出来,然后对剩余的节点进行逆序,最后将当前的表头节点连接到新链表的尾部。...图(5)第一次递归状态图 这里边的关键点是头节点head的下一个节点head->next将是逆序后的新链表的尾节点,也就是说,被摘除的头接点head需要被连接到head->next才能完成整个链表逆序

72630

C语言逆序输出整数

return 0; } 测试的结果: 输入:501 , 输出:105 输入:521 , 输出:125 输入:025 , 输出:52 //注意,我们说的整数025其实就是25,所以逆序输出之后是...52 输入:520 , 输出:25 如果想要逆序后开头的 0 也显示,比如输入500,输出005,则可以将上面代码变为下面这种: #include int main() {...return 0; } 测试的结果: 输入:501 , 输出:105 输入:521 , 输出:125 输入:025 , 输出:52 //注意,我们说的整数025其实就是25,所以逆序输出之后是...---- 初次写于2018-12-15: 在很多编程练习中都会遇到关于数字方面的题目,其中比较常见的一种是逆序输出整数。 下面我给出一个最简单的例子。...(自己找几个数,在草稿纸上算一算,然后就会明白了) ---- 更新(2021/4/8): 由于部分同学评论说输入的整数后面带0的话,逆序后不会显示0,比如,输入300,逆序后只输出3,而不是003 所以我又重新更新了一份代码

4.3K30

c语言 挑战本站最详细注释链表实现

经过上一个文章单链表的实现,我决定写一个具有详细注释的链表代码展示。 声明:本文章采用头结点方式,本文章结构先是代码分装函数,最后有全部代码实现 ---- 1.   ...sizeof(Node)); //动态开辟一个结点 assert(L); //判断L是否成功开辟,如果开辟失败直接报错 L->data = 0; //头结点的数据域来储存链表元素个数...deleteList(Node* L,int data) { Node* node = L->next; if (node == NULL) //判断链表是否为空...free(node); //释放要删除的结点 node = NULL; //避免野指针出现 L->data--; //记录元素个数减一 } 5.打印链表...tailList(L, 1); //头插添加元素1 tailList(L, 2); //头插添加元素2 printList(L); //打印链表

13530

链表分组逆序

链表分组逆序是一个常见的操作,用于将链表按照一定规则分组后,逆序每个分组。这种操作常常用于解决链表中的某些问题。...下面介绍几种常见的用于链表分组逆序的算法,并分析它们的优劣势: 迭代法 •算法描述:迭代法是一种直观的方法。...它维护一个虚拟头节点,然后按照指定的组数 k,逐一遍历链表,将每组的节点逆序,然后将前一组的尾部节点与当前组的头部节点相连接。•优点:相对容易理解和实现,不需要额外的空间。...•算法描述:指针法维护两个指针,一个指向每组的头部,另一个用于遍历组内的节点,逆序每组内的节点。...栈法和指针法通常是效率较高的方法,它们可以在一次遍历中完成操作。递归法和迭代法相对直观,但在大多数情况下需要多次遍历链表,效率较低。最佳选择取决于问题要求和个人偏好。

12020

C语言链表实例--玩转链表

下图为最一简单链表的示意图: 第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。...这样一种连接方式,在数据结构中称为“链表”。 而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。...链表的基本操作对链表的主要操作有以下几种: 1. 建立链表; 2. 结构的查找与输出; 3. 插入一个结点; 4. 删除一个结点; 建立一个三个结点的链表,存放学生数据。...可编写一个建立链表的函数 creat。...下方为创客专门针对C语言链表分析的视频资料,对链表感兴趣的可以看看学习下 1 C语言玩转链表 http://www.makeru.com.cn/live/1392_338.html?

2K31

【数据结构】C语言实现链表的基本操作

对指针这一块的知识掌握的不牢固的朋友可以通过【C语言总集篇】指针篇这篇博客来复习一下指针的相关知识点 我们在对链表初始化之后就可以来通过头插法或者尾插法来创建一个链表了; 四、链表的创建 由于链表的结点结构与单链表的结点结构不同...: 新结点的后继指针指向头结点的后继指针指向的对象,即NULL; 新结点的前驱指针指向头结点; 头结点的后继指针指向新结点; 用C语言来描述的话则是: //头插法创建第一个表头结点的插入步骤 New_Node...用头插法创建第二个及以上的表头结点的步骤: 新结点的后继指针指向头结点的后继指针指向的对象,即表头结点; 头结点后继指针指向对象的前驱结点指向新结点; 新结点的前驱指针指向头结点; 头结点的后继指针指向新结点; 用C语言描述的话则是...; 将当前结点的后继结点的前驱指针指向当前结点的前驱结点; 释放当前结点的空间; 将其转换成C语言则是: //链表的删除操作 DNode->prior->next = DNode->next;//将前驱结点的后继指针指向后继结点...//将后继结点的前驱指针指向前驱结点 free(DNode);//释放当前结点的内存空间 如果是删除的结点为表尾结点,则我们只需要将表尾结点的前驱结点指向空指针,然后直接释放表尾结点的空间就行,转换成C语言则是如下所示

18010

C语言链表实例--玩转链表

下图为最一简单链表的示意图:   第 0 个结点称为头结点,它存放有第一个结点的首地址,它没有数据,只是一个指针变量。...链表中的每一个结点都是同一种结构类型。   指针域: 即在结点结构中定义一个成员项用来存放下一结点的首地址,这个用于存放地址的成员,常把它称为指针域。   ...这样一种连接方式,在数据结构中称为“链表”。   而使用动态分配时,每个结点之间可以是不连续的(结点内是连续的)。...链表的基本操作对链表的主要操作有以下几种:   1. 建立链表;   2. 结构的查找与输出;   3. 插入一个结点;   4. 删除一个结点;   建立一个三个结点的链表,存放学生数据。...可编写一个建立链表的函数 creat。

1.6K20

2-6 链表逆序

2-6 链表逆序 我只介绍两种常用方法吧,非递归方法 和 递归 方法 我觉得够用就行 1、非递归方法: 将第二个元素后面的元素依次插入到头结点后面, 最后再把原始第一个元素放到原始第二个元素后面,整个链表就能够反转了...这个方法对于带不带头结点的链表都适用: ①不带头结点 原始链表,其中第二个元素是 B A -> B-> C -> D -> E -> F -> null 先进入循环,不断的把B的后继元素往第一个元素后面插...可以将头结点视为第一个元素,那么就是直接把 A 的后继元素不断的往head后面插: 带头结点原始链表,将头结点视为第1个元素,那么其中第2个元素是 A Head -> A -> B -> C -> D...所以我们改一下调用的那行代码,就可以拿来对带头结点的单链表 进行逆序操作了: list2->next = ReverseList_DG(list2->next) 上面这行代码,是把带头结点的单链表的下一个元素...(其实带头结点的单链表不看头结点就是 一个不带头结点的单链表) 然后把返回的 新的地址,又接入到 头结点的后面! 这样就可以在不改变原来头结点 地址 的情况下, 仅对数据部分进行逆序啦。

81310

C语言 | 链表概述

“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆 这道理放在C语言学习上也一并受用。...在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。 那么如何学习呢?当然是每天都练习一道C语言题目!! ? 作者 闫小林 白天搬砖,晚上做梦。...C语言链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构,是根据需要开辟内存单元。 链表有一个“头指针”变量,它存放一个地址,该地址指向一个元素。...如果不提供“头指针”,则整个链表都无法访问。 链表如同一条铁链一样,一环扣一环,中间是不能断开的。...C语言使用链表输出学号和成绩 #include//头文件 struct student //定义学生结构体 { int num; //学号 float score;//成绩

1.2K30
领券