番禺网站建设培训班友情链接交换方式有哪些

news/2025/9/25 13:48:26/文章来源:
番禺网站建设培训班,友情链接交换方式有哪些,企业门户网站模式,上海网站建设红旗一、什么是数据结构 数据结构是一组用来保存一种或多种特定关系的数据的集合。其主要目的是组织和存储数据#xff0c;以便于高效的访问和修改。在程序设计中#xff0c;将大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中#xff0c;并在此基础上实现某个特定…一、什么是数据结构 数据结构是一组用来保存一种或多种特定关系的数据的集合。其主要目的是组织和存储数据以便于高效的访问和修改。在程序设计中将大量而复杂的问题以特定的数据类型和特定的存储结构存储在内存中并在此基础上实现某个特定的功能的操作即 程序 数据结构 算法 二、 数据与数据之间的关系 2.1 数据的逻辑结构 集合数据元素之间关系平等常用于处理无关元素的组。线性结构元素之间存在一对一的关系常见的有数组、链表、队列、栈等。树型结构元素之间存在一对多的关系典型的如二叉树。图形结构元素之间存在多对多的关系形成网络状的结构。 2.2 数据的物理结构 数据的逻辑结构在计算机内存中的存储方式是其物理结构主要包括以下几种存储方式 顺序存储 利用一段连续的内存空间来保存元素。优点 空间连续访问方便如随机访问。缺点 插入与删除操作需要移动大量元素。需要预分配内存空间。容易造成存储空间碎片。链式存储 使用非连续的内存空间保存元素。优点 插入和删除数据方便。不需要预分配内存。缺点 访问元素的效率低。索引存储 通过关键字构建索引表通过该索引表找到数据的存储位置。散列存储哈希存储 将数据元素的存储位置与关键码之间建立确定对应关系以实现快速查找。 三、储备知识 指针用于存储其他变量的地址是链式存储结构的关键。结构体在编程中常用结构体定义数据节点便于管理数据。动态内存分配为数据结构中的节点动态分配和释放内存。 四、 链式数据结构单向链表 4.1 定义 单向链表是一种线性数据结构由一系列节点构成每个节点包含数据部分和指向下一个节点的指针。它是一种灵活的存储方式相比于数组单向链表不需要连续的内存空间。 4.2 结构 节点(Node) 数据部分存储实际的数据。指针部分指向下一个节点的指针。 链表头(Head) 链表的起始节点所有操作通常从此节点开始。 尾节点(Tail) 链表的最后一个节点其指针部分为空表示链表的结束。 4.3 主要操作 插入操作 在头部创建新节点将其指针指向当前头节点然后更新头节点。在尾部遍历找到最后节点令其指向新节点并将新节点的指针设为 null。在指定位置找到插入位置的前一节点将新节点连接至该位置。 删除操作 删除头节点更新头节点为当前头节点的下一个节点。删除尾节点遍历找到倒数第二个节点更新其指针为 null。删除特定位置节点找到前一节点调整指针跳过待删除节点。 查找操作 从头节点开始遍历链表逐个比较数据部分查找特定值。 4.4 优缺点 优点 动态存储插入和删除方便。缺点 存储开销大每个节点额外的指针。访问效率低需要遍历。 示例 // 定义数据类型为整型 typedef int Datatype; // 定义链表节点结构 typedef struct node { Datatype data; // 节点存储的数据 struct node * pnext; // 指向下一个节点的指针 } node_t; // 定义链表结构 typedef struct link { struct node* phead; // 指向链表头节点的指针 int clen; // 链表中节点的数量 } link_t;// 创建链表 link_t* create_link() { // 分配内存给链表结构 link_t * plink malloc(sizeof(link_t)); if(NULL plink ) { perror(create link error); // 内存分配失败 return NULL; } plink-phead NULL; // 初始化头指针为空 plink-clen 0; // 初始化链表长度为0 return plink; // 返回新创建的链表 } // 在链表头部插入新节点 int push_into_link_head(link_t* plink, Datatype data) { // 分配内存给新节点 node_t* pnode malloc(sizeof(node_t)); if(NULL pnode) { perror(push node error); // 内存分配失败 return -1; } pnode-data data; // 设置节点数据 pnode-pnext plink-phead; // 新节点指向当前头节点 plink-phead pnode; // 更新头节点为新节点 plink-clen; // 增加链表长度 return 0; // 成功 } // 遍历并打印链表中的所有节点数据 int traverse_print_link(link_t* plink) { node_t* p plink-phead; // 从头节点开始 while(p) { printf(%d , p-data); // 打印节点数据 p p-pnext; // 移动到下一个节点 } printf(\n); // 打印换行 return 0; // 成功 } // 在链表尾部插入新节点 int push_into_link_tail(link_t * plink, Datatype data) { // 分配内存给新节点 node_t * pnode malloc(sizeof(node_t)); pnode-data data; // 设置节点数据 pnode-pnext NULL; // 新节点的下一个指针为空 if(plink-phead NULL) // 如果链表为空 { plink-phead pnode; // 头指针指向新节点 } else { node_t* p plink-phead; // 从头节点开始遍历 while(p-pnext) // 找到最后一个节点 { p p-pnext; } p-pnext pnode; // 将最后一个节点的指针指向新节点 } plink-clen; // 增加链表长度 return 0; // 成功 } // 从链表头部删除节点 int pop_into_link_head(link_t* plink) { if(NULL plink-phead) // 如果链表为空 { return 0; // 无需删除 } else { node_t *pnode plink-phead; // 获取头节点 plink-phead pnode-pnext; // 更新头节点为下一个节点 free(pnode); // 释放原头节点内存 } plink-clen--; // 减少链表长度 return 0; // 成功 } // 从链表尾部删除节点 int pop_into_link_tail(link_t* plink) { if(NULL plink-phead) // 如果链表为空 { return 0; // 无需删除 } else if(plink-phead-pnext NULL) // 如果只有一个节点 { pop_into_link_head(plink); // 删除头节点 } else { node_t * pnode plink-phead; // 从头节点开始遍历 while(pnode-pnext-pnext) // 找到倒数第二个节点 { pnode pnode-pnext; } free(pnode-pnext); // 释放最后一个节点内存 pnode-pnext NULL; // 将倒数第二个节点的指针设为NULL plink-clen--; // 减少链表长度 return 0; // 成功 } return 0; // 成功 } // 在链表中查找特定数据的节点 node_t * search(link_t* plink, Datatype data) { node_t* pnode plink-phead; // 从头节点开始 while(pnode) { if(pnode-data data) // 如果找到数据 { return pnode; // 返回该节点 } pnode pnode-pnext; // 移动到下一个节点 } return NULL; // 未找到 } // 修改链表中指定数据的节点数据 int change_link_data(link_t* plink, Datatype srcdata, Datatype destdata) { node_t * node search(plink, srcdata); // 查找源数据节点 node-data destdata; // 修改节点数据 return 0; // 成功 } // 销毁链表释放所有节点内存 int destory_link(link_t* plink) { while(plink-phead) // 当链表不为空 { pop_into_link_head(plink); // 删除头节点 } free(plink); // 释放链表结构内存 return 0; // 成功 } // 查找链表中的中间节点 node_t * search_mid_node(link_t * plink) { node_t * pnode plink-phead; // 从头节点开始 if(NULL pnode) // 如果链表为空 { return NULL; // 返回NULL } if(plink-clen 1) // 如果只有一个节点 { return pnode; // 返回该节点 } int i 0; while(pnode) { pnode pnode-pnext; // 移动到下一个节点 i; if(i (plink-clen) / 2) // 找到中间节点 { break; } } return pnode; // 返回中间节点 } // 从链表中查找倒数第number个节点 node_t *search_countdown(link_t* plink, int number) { node_t* pnode plink-phead; // 从头节点开始 if(NULL pnode) // 如果链表为空 { return NULL; // 返回NULL } if(plink-clen 1) // 如果只有一个节点 { if(number 1) { return pnode; // 返回该节点 } return NULL; // 返回NULL } int i 0; while(pnode) { pnode pnode-pnext; // 移动到下一个节点 i; if(i (plink-clen) - number) // 找到倒数第number个节点 { break; } } return pnode; // 返回该节点 } // 删除指定位置的节点 int pop_appointed_node(link_t* plink, int appointed) { if (plink-phead NULL) // 如果链表为空 { return -1; // 返回错误 } if (appointed 1 || appointed plink-clen) // 如果指定位置不合法 { return -1; } node_t* pnode plink-phead; if (appointed 1) // 如果删除的是头节点 { pop_into_link_head(plink); // 删除头节点 return 0; } for (int i 1; i appointed - 1; i) // 遍历到指定位置的前一个节点 { pnode pnode-pnext; } node_t* temp pnode-pnext; // 获取要删除的节点 if (temp NULL) // 如果要删除的节点不存在 { return -1; } pnode-pnext temp-pnext; // 将前一个节点的指针指向要删除节点的下一个节点 free(temp); // 释放要删除节点的内存 plink-clen--; // 减少链表长度 return 0; // 成功 }

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

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

相关文章

网站关键词搜不到了百度建网站

做过很多winform项目,都为winform控件头疼不已。想实现一些漂亮的样子总是很难。我这里列举几个缺点: 1.winform控件大多是 绝对布局 ,你需要给出准确的坐标。那么在实现居中效果就会很难。 2.学习成本,也了解各个控件的结构&…

MyBatisPlus 会默认设置 mybatis 的 scanPackages 为当前 BeanFactory 的 auto-configuration 的 base packages

MyBatisPlus 会默认设置 mybatis 的 scanPackages 为当前 BeanFactory 的 auto-configuration 的 base packagesMybatisPlus 在自动配置时,会自动注册 MapperScannerConfigurer,并设置 自动扫描 Mapper 的 basePacka…

工程实践 使用本地包开发python项目

工程实践 使用本地包开发python项目 当python项目比较庞大, 把共用的公共函数和方法封装成一个本地包不仅便于在不同项目间复用,还能通过统一的方式读取资源文件, 是一个很好的工程实践. 下面来介绍一下这种开发方式.…

详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战

详细介绍:Python + Flask + API Gateway + Lambda + EKS 实战pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Con…

实用指南:【设计模式】适配器模式 在java中的应用

实用指南:【设计模式】适配器模式 在java中的应用2025-09-25 13:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

日记4

今天接着学Java,直接从类和对象入手。理解类是模板,对象是实例,像设计图纸和盖好的房子。试着写简单类定义对象,一开始老把属性和方法弄混,改了几次代码,终于成功创建对象并调用方法,感觉对面向对象的思路更清晰…

P2042 [NOI2005] 维护数列 题解

QwQP2042 [NOI2005] 维护数列 题解 平衡树 因为操作里面有翻转,严格强于文艺平衡树,所以考虑平衡树维护数列。直接暴力插入即可 分裂出删除的子段,然后合并其两端的平衡树 分裂出修改的子段,然后打推平的懒标记, …

达梦数据库查询字段类型为Date 修改为DateTime

SELECT ALTER TABLE || OWNER || . || TABLE_NAME || MODIFY || COLUMN_NAME || DATETIME; AS alter_sql FROM ALL_TAB_COLUMNS WHERE DATA_TYPE = DATE and OWNER=PS_EXAMPLEDBUSER order by COLUMN_NAME asc

详细介绍:PyTorch 神经网络工具箱

详细介绍:PyTorch 神经网络工具箱pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

C++ new 操作符在操作系统层执行了什么操作?

C++ new 操作符在操作系统层执行了什么操作?在C++中,new操作符的执行涉及操作系统层面的内存分配和对象构造过程,具体可分为以下几个关键步骤: 1. 调用内存分配函数(operator new) new操作符首先通过operator ne…

[ABC422F-G] 题解

QwQ[ABC422F-G] 题解 F - Eat and Ride 考虑 DP,DP 状态要么压和要么压长度,如果压和就很直接,但是显然复杂度会爆炸,如果压长度的话,可以发现每到一个新点都要算:这条路径中在它后面的点的个数乘上它的点权,所…

天津模板建站代理wordpress增加赞赏

代码参考:《重学Java设计模式小傅哥》 目录1、静态类使用2、懒汉模式(线程不安全)3、懒汉模式(线程安全)4、饿汉模式(线程安全)5、使用类的内部类(线程安全)6、双重锁检验…

最新获取网站访客qq接口推客平台有哪些

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体邀约的好处主要体现在提高品牌知名度、扩大受众群体以及与媒体建立良好的合作关系。 媒体邀约是一种有效的公关策略,通过吸引媒体关注来促进信息的传播。它可以帮助组织…

山东省住房和城乡建设部网站首页四川润邦建设工程设计有限公司网站

大家好,我是阿赵。   这篇文章我想写了很久,是关于Unity项目使用AssetBundle加载资源时的内存管理的。这篇文章不会分享代码,只是分享思路,思路不一定正确,欢迎讨论。   对于Unity引擎的资源内存管理,我…

公司网站模板源代码常州微网站建设文档

如果有客户端1、客户端2等N个客户端争抢一个 Zookeeper 分布式锁。大致如下: 1: 大家都是上来直接创建一个锁节点下的一个接一个的临时有序节点 2: 如果自己不是第一个节点,就对自己上一个节点加监听器 3: 只要上一…

c# Listdynamic 按字段排序

public static List<dynamic> OrderByKey (this IList<dynamic> list, string propertyName, bool isDescending = false){var propertyInfo = list[0].GetType().GetProperty(propertyName);if (isDescen…

你看到的和你想要的

你看到的和你想要的 漫思

建设一个货代网站想要多少钱做谷歌网站使用什么统计代码

官方文档&#xff1a;入门指南 | Selenium Selenium是一个用于Web应用测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 所以使用这个前端测试话工具&#xff0c;可以自动化做很多事情&#xff0c;比如自动化抓取网页内容&#xff0c;俗称网…

大兴网站定制开发房地产招新人的坑

依赖倒转原则 在大话设计模式这本书中&#xff0c;作者通过电话修电脑这个例子引入了面向对象设计的基本原则之一&#xff1a;依赖倒转原则。 概念 依赖倒转原则是面向对象设计的基本原则之一&#xff0c;它用于减少类之间的耦合&#xff0c;提高系统的灵活性和可维护性。在…

东莞网站制作电话糗事百科 wordpress

文章目录1. 题目2. 解题1. 题目 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回符合要求的最少分割次数。 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s 分割成 ["aa","b"] 这样两个回文…