线性结构之链表

news/2025/9/23 0:00:28/文章来源:https://www.cnblogs.com/EricsT/p/19104434

离散存储[链表]:

  定义:

    n个结点的离散分配

    彼此通过指针相连

    每个结点只有一个前续结点

    每个结点只有一个后续结点

    首结点没有前续结点

    尾结点没有后续结点

  专业术语:

    首结点:第一个有效结点,存放第一个有效数据

    尾结点:最后一个有效结点,存放最后一个有效数据

    头结点:在首结点之前的一个结点,既不存放有效数据,也不存放有效结点的个数,加头结点的主要目的是为了方便对链表的操作,头结点的数据类型和其他结点的数据类型是一样的

    头指针:指向头结点的指针变量,存放了头结点的地址

    尾指针:指向尾结点的指针变量,存放了尾结点的地址

  确定一个链表至少需要哪些参数:

    只需要一个参数:头指针

    因为我们通过头指针就可以推出链表的其他所有信息

  链表的分类:

    单链表:每一个结点只有一个指针域

    双链表:每一个结点有两个指针域

    循环链表:能通过任何一个结点找到其他所有的结点

    非循环链表

 

  算法:

    狭义的算法是与数据存储方式密切相关的

    广义的算法与数据存储方式无关

    泛型:你用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的


/*
@file      main.c
@brief     线性结构之链表
@author    EricsT (EricsT@163.com)
@version   v1.0.0
@date      2025-09-21
@history   2025-09-21 EricsT - 新建文件2025-09-22 EricsT - 新增 CreateList\TraverseList2025-09-22 EricsT - 新增 isEmptyList\GetLenthList\InsertList\DeleteList\SortList
*/#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>typedef struct Node
{int data;//数据域Node* ptrNext;//指针域
}* PtrNode, NODE;//NODE 相当于 Node NODE//ptrNode 相当于 Node* ptrNodePtrNode CreateList();//创建链表
void TraverseList(const PtrNode ptrNode);//遍历链表
bool isEmptyList(const PtrNode ptrNode);//是否为空
int GetLenthList(const PtrNode ptrNode);//获取链表长度
bool InsertList(PtrNode ptrNode, int insertPos, int insertData);//插入结点
bool DeleteList(PtrNode ptrNode, int deletePos);//删除结点
void SortList(PtrNode ptrNode);//排序int main(void)
{PtrNode ptrNode = NULL;ptrNode = CreateList();TraverseList(ptrNode);if (isEmptyList(ptrNode))printf("链表为空\n");elseprintf("链表非空\n");printf("链表长度为:%d\n", GetLenthList(ptrNode));int insertPose;printf("请输入插入位置");scanf("%d", &insertPose);int insertValue;printf("请输入插入数值");scanf("%d", &insertValue);InsertList(ptrNode, insertPose, insertValue);TraverseList(ptrNode);int deletePose;printf("请输入删除位置");scanf("%d", &deletePose);DeleteList(ptrNode, deletePose);TraverseList(ptrNode);SortList(ptrNode);TraverseList(ptrNode);return 0;
}PtrNode CreateList()
{int len;printf("请输入结点个数len = ");scanf("%d", &len);int addr = 0;PtrNode ptrNodeFirst = (PtrNode)malloc(sizeof(NODE));//头结点if (NULL == ptrNodeFirst){printf("分配失败\n");exit(-1);}PtrNode ptrNodeLast = ptrNodeFirst;//尾结点ptrNodeLast->ptrNext = NULL;for (int i = 0; i < len; ++i){PtrNode ptrNode = (PtrNode)malloc(sizeof(PtrNode));//新的尾结点if (NULL == ptrNodeFirst){printf("分配失败\n");exit(-1);}ptrNodeLast->ptrNext = ptrNode;//新的尾结点挂在旧的尾结点后面printf("请输入%d个结点的数值", i + 1);scanf("%d", &ptrNode->data);ptrNode->ptrNext = NULL;ptrNodeLast = ptrNode;//更新尾结点}return ptrNodeFirst;
}void TraverseList(const PtrNode ptrNode/*头结点*/)
{PtrNode ptrNode_ = ptrNode->ptrNext;//首节点while (NULL != ptrNode_)//结点为空,则是尾结点{printf("%d ", ptrNode_->data);ptrNode_ = ptrNode_->ptrNext;//下一结点}printf("\n");
}bool isEmptyList(const PtrNode ptrNode)
{PtrNode ptrNode_ = ptrNode->ptrNext;//首节点if (NULL == ptrNode->ptrNext)return true;return false;
}int GetLenthList(const PtrNode ptrNode)
{int iLen = 0;PtrNode ptrNode_ = ptrNode->ptrNext;//首节点while (NULL != ptrNode_)//结点为空,则是尾结点{ptrNode_ = ptrNode_->ptrNext;//下一结点iLen++;}return iLen;
}bool InsertList(PtrNode ptrNode, int insertPos, int insertData)
{if (insertPos < 1)return false;if (insertPos > (GetLenthList(ptrNode) + 1))return false;PtrNode ptrNodeInsert = (PtrNode)malloc(sizeof(Node));ptrNodeInsert->data = insertData;PtrNode ptrNodeCur = ptrNode;for (int i = 1; i < insertPos; ++i)ptrNodeCur = ptrNodeCur->ptrNext;ptrNodeInsert->ptrNext = ptrNodeCur->ptrNext;ptrNodeCur->ptrNext = ptrNodeInsert;return true;
}bool DeleteList(PtrNode ptrNode, int deletePos)
{if (deletePos < 1)return false;if (deletePos > GetLenthList(ptrNode))return false;PtrNode ptrNodeCur = ptrNode;for (int i = 1; i < deletePos; ++i)ptrNodeCur = ptrNodeCur->ptrNext;ptrNodeCur->ptrNext = ptrNodeCur->ptrNext->ptrNext;return true;
}void SortList(PtrNode ptrNode)
{int iLen = GetLenthList(ptrNode);PtrNode ptrNodeCur = ptrNode;//头结点for (int i = 0; i < iLen; ++i){ptrNodeCur = ptrNodeCur->ptrNext;PtrNode ptrNodeNext = ptrNodeCur->ptrNext;while (NULL != ptrNodeNext){if (ptrNodeCur->data > ptrNodeNext->data){int temp = ptrNodeCur->data;ptrNodeCur->data = ptrNodeNext->data;ptrNodeNext->data = temp;}ptrNodeNext = ptrNodeNext->ptrNext;}}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910814.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高职教育双高建设网站佛山建设网站公司哪家好

1、基础用法就不再赘述了&#xff0c;重要的属性配置&#xff1a; Disable Catalog Update on Startup&#xff1a;禁用时在初始化Addressables的时候自动更新远程的catalog&#xff08;启用后可以通过代码 Addressables.CheckForCatalogUpdates()更新&#xff09; Use…

营销型网站软件建立网站需要多少钱就蓷y湖南岚鸿推荐

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况&#xff1a; 3.4realloc有malloc的功能 五、常见的动…

简单的购物网站设计大型免费网页游戏排行榜

SH文件介绍 介绍SH文件示例执行SH文件具体用法 介绍 SH文件通常指的是 Shell 脚本文件&#xff0c;文件后缀名为.sh&#xff0c;其中包含一系列要由操作系统的命令解释器执行的命令。 在 Unix 和类 Unix 操作系统中&#xff0c;通常使用 Bourne Shell&#xff08;sh&#xff…

博客网站建设源码上海互联网推广找哪家

打卡记录 同积元组&#xff08;哈希表 排列组合&#xff09; 链接 思路&#xff1a;用哈希表将数组中出现的两不同数乘积依次记录&#xff0c;将出现两次以上的乘积组通过排列组合计算总情况个数。 class Solution { public:int tupleSameProduct(vector<int>& num…

分类信息网站如何优化wordpress会员通知插件

一、Array方法 方法参数返回值描述以下Api会修改原属组pushitem1, item2, ...数组新长度向数组的末尾添加一个或多个元素&#xff0c;并返回新的长度pop删除的元素删除数组的最后一个元素&#xff0c;并返回删除的元素unshiftitem1,item2, ...数组新长度向数组的开头添加一个或…

展示型网站一样做seo优化网站维护合同范本

原网址&#xff1a;http://pichcar.iteye.com/blog/676292 URL中的特殊字符 有些符号在URL中是不能直接传递的&#xff0c;如果要在URL中传递这些特殊符号&#xff0c;那么就要使用他们的编码了。编码的格式为&#xff1a;%加字符的ASCII码&#xff0c;即一个百分号%&#xff0…

网站建设和管理是教什么科目成都房地产政策

服务器数据恢复环境&#xff1a; 某单位一台DS5300存储&#xff0c;1个主机4个扩展柜&#xff0c;组建了2组RAID5&#xff08;一组27块硬盘&#xff0c;一组23块盘&#xff09;。27块盘的那组RAID5阵列存放Oracle数据库文件&#xff0c;存储系统一共分了11个卷。 服务器故障&a…

可以做手机网页的网站个人怎么进行网站建设

一、点查看自定义快捷键可以定义一些快速启动方式 然后用不习惯的快捷键也能在这里改 二、android studio 快捷键导出备份 导入方法&#xff1a; android studio &#xff0d;>file->import setting ->选择jar包即可 导出studio的设置方法&#xff1a; android …

AI 编程“效率幻觉”:为何你感觉快了,项目却慢了?

AI 编码工具普及,但为何开发者感觉很快,实际项目却变慢了?本文深入剖析 AI 编程“感知差距”背后的根源,探讨如何通过结构化输入,真正释放 AI 潜能。一、AI 编程的“速度与激情”背后 2025 年,如果你问一个开发者…

lc1033-移动石子直到连续

难度:中等(伪境)题目描述数轴上有三块石子,最左边的石子可以向右移,但不能越过最右边的石子 不能放在有石子的地方最右侧的石子同理 每次只能移动一块石子,在上面规则下不限制距离 问从初始位置到三块石子相邻,…

广东平台网站建设平台小学校园网站建设方案

我的世界换肤教程&#xff0c;本篇教程记录如何使用MCSkin 3D软件、皮肤使用、皮肤预览图制作等相关教程。感兴趣的小伙伴们可以来看看这篇我的世界皮肤教程。一.MCSkin 3D1.4软件介绍及教程&#xff1a;1. 视图-3D设置-屏蔽部位半透明显示在绘制其他部位时&#xff0c;可以用半…

苏州建站公司兴田德润简介呢wordpress 采集发布

大家根据电脑系统的位数&#xff0c;选择 32 位的 VM 配置文件或者 64 位的 VM 配置文件32 位操作系统内存不会超过 4G&#xff0c;所以没有多大空间可以调整&#xff0c;建议不用调整了64 位操作系统中 8G 内存以下的机子或是静态页面开发者是无需修改的。64 位操作系统且内存…

淄博网站制作服务网站名称是什么

人民邮电出版社图灵公司介绍&#xff08;来自http://www.turingbook.com/&#xff09; 北京图灵文化发展有限公司成立于2005年6月&#xff0c;由人民邮电出版社投资控股&#xff0c;以策划出版高质量的科技书籍为核心业务&#xff0c;主要出版领域包括计算机、电子电气、数学统…

滕州网站优化宁波创建网站

一、存储引擎概念介绍 MySQL中的数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力&#xff0c;这些不同的技术以及配套的功能在MySQL中称为存储引擎 存储引擎是MySQL将数据存储在文件系统中的存储…

手机网站加速器w7自己做网站

可以以电脑浏览器的手机模式打开&#xff0c;也可以在手机浏览器中直接打开 游戏运用了Canvas的drawImage&#xff0c;translate&#xff0c;rotate&#xff0c;save&#xff0c;restore&#xff0c;fillRect等API。 采用中介者模式&#xff0c;Game类统领全局&#xff0c;负责…

网站研发进度表下载零遁nas做网站

一、环境准备&#xff1a; 1、安装appium 2、xcode (appium 版本&#xff1a;12.1.0 xcode版本&#xff1a;12.5 可正常运行&#xff0c;ps:appium 版本&#xff1a;12.1.0 xcode版本&#xff1a;13.0 一直报奇奇怪怪的错误&#xff09; 3、依赖工具包安装 brew install…

网站建设mvc三层框架图网站模板下载破解版

Transformer模式是Java&#xff08;以及可能仅具有使用场所差异和不变参数类型的其他OO语言&#xff09;的设计模式&#xff0c;可帮助子类型层次结构内的对象将自己流畅地转换为任何类型的对象。 语境 我一直在关注与Jim Laskey发行的JDK-8203703相关的OpenJDK线程&#xff…

专业做网站制作paypal网站做外贸

我发现org.apache.commons.pool非常有用且健壮&#xff0c;但没有充分记录。 因此&#xff0c;我将在这里帮助您解释如何使用Apache KeyedObjectPool 。 什么是KeyedObjectPool &#xff1f; 它是一个映射&#xff0c;其中包含多种类型的实例池。 可以使用任意键访问每种类型。…

大连网站推广爱得科技公司建网站怎么建

Python数据库编程实战&#xff1a;sqlite3模块详解 在Python中&#xff0c;数据库编程是一项重要且实用的技能。通过数据库&#xff0c;我们可以高效地存储、检索和管理大量数据。Python提供了多种数据库编程接口&#xff0c;其中sqlite3模块是一个轻量级的关系型数据库引擎&a…

Modularity —— A thinking to separate complexity

Modularity —— A thinking to separate complexityPosted on 2025-09-22 23:48 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:Modularity —— A thinking to separate complexityModularity —— A thinkin…