同一带头结点的双向链表上是否会出现电流均向带头结点的双向链表外输出或向带头结点的双向链表输入,如果有那又是为什么

所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.至到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 外部JS的阻塞下载 所有浏览器在下载JS的时候,会阻止一切其他活动,比如其他资源的下载,内容的呈现等等.至到JS下载.解析.执行完毕后才开始继续并行下载其他资源并呈现内容. 有人会问:为什么JS不能像CSS.image一样并行下载了?这里需要简单介绍一下浏览器构造页面的原理, 当浏览器从服务器接收到了HTML文档,并把HTML在内存中转换成DO
package jxau.lyx. /** * * @author: liyixiang * @data: * @题目大意: * 求两个单链表相交的第一个节点 * @主要思路: * 对第一个链表遍历,计算长度len1,同时保存最后一个节点的地址. * 对第二个链表遍历,计算长度len2,同时检查最后一个节点是否和第一个链表的最后一个节点 * 相同,若不相同,不相交,结束. * 两个链表均从头节点开始,假设len1大于len2,那么将第一个链表先遍历len1-len2个
今天客户提出要点击菜单(TreeView实现的)的父级节点时,展开节点,很多新手朋友可能对此会很陌生,接下来介绍解决方法,感兴趣的朋友可以了解下 以前一个现在不用的帐号发布的随笔,现在人肉搬过来吧. 注册用户有一段时间了,一直很忙,到现在还没有写一篇,忽然觉的一定要花点时间记录和总结一些东西.好吧,就从这里开始了. 今天客户提出要点击菜单(TreeView实现的)的父级节点时,展开节点.心想这个应该是很常见的功能吧,特意google了一下,发现大部分是将的不是js实现的,有些js实现的写的麻烦,
本文实现算法来删除单链表中的中间节点,只知道指向该节点中间节点的指针,大家可以参考使用 问题如下 输入:链表 a-&b-&c-&d-&e中指向节点c的指针 输出:无返回值,但新链表变为a-&b-&d-&e 解答: 想了好久没想出来,看了提示才知道解法的.这里用到了一个小技巧.要删除中间节点,但是我们不知道要删除节点的上一个节点p,所以无法通过修改指针的方法(p-&next=del-&next)来删除节点,但知道要删除节点的后一个节点,那么我们换一个思路
双控制节点通过heartbeat+pacemaker监控相关服务,所以须在两台控制节点上先安装heartbeat软件,安装过程可参照: http://my.codeweblog.com/guol/blog/90128 pacemaker主要是对控制节点上的资源进行切换,实际需求如下:只要主控制节点上任何一个与openstack相关的服务停止,都需要把vip及相关服务切换到备控制节点. 备控制节点的安装和主控制节点一样,在配置数据库时需要配置成slave,和主控制节点上的master实时同步,可以
一次实习面试的时候碰到了这个问题,现在把它记录下来. 给你单链表的头指针*h.某一个节点指针*p(p节点不是最后一个),在常数时间复杂度内删除P节点 其实这个问题很简单,把这个节点下一个节点的值付给这个节点,然后删除下一个节点就好了.伪代码如下: void deleteNode(Node *h,Node *p) { //判断链表是否为空,为空则直接返回 if(head-&next() == null) //判断p节点是不是最后一个节点,如果不是最后一个节点,则删除下一个节点,否则
最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节点的定义(只读) Doctype 指定文档类型节点(只读) documentElement 返回文档的根元素(可读写) firstChild 返回当前节点的第一个子节点(只读) Implementatio
放在head中的JS代码会在页面加载完成之前就读取,而放在body中的JS代码,会在整个页面加载完成之后读取 那么有什么不同呢?先看一个例子: 一个二级级联动态下拉列表框,一级分类(即大类别)id=&vSort0&. &head& function changelocation(id) {----} &/head& &body&&select class=&input1& id=&vSort0& name
/** * 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 */ var Prototype = { Version: '@@VERSION@@' } /** * 创建一种类型,注意其属性 create 是一个方法,返回一个构造函数. * 一般使用如下 * var X = Class.create(); 返回一个类型,类似于 java 的一个Class实例. * 要使用 X 类型,需继续用 new X()来获取一个实例,如同 java 的 Class.newInstan
遍历子节点子元素的方法有很多,本例使用js来实现,另附示例代码及属性方法,需要的朋友可以参考下 // 添加子节点前 删除所有子节点 var usernameEle = document.getElementById(&username&); var childs = usernameEle.childN for(var i = childs.length - 1; i &= 0; i--) { usernameEle.removeChild(childs[i]); }
最近发现DOMDocument对象很重要,还有XMLHTTP也很重要 注意大小写一定不能弄错. 属性: 1Attributes 存储节点的属性列表(只读) 2childNodes 存储节点的子节点列表(只读) 3dataType 返回此节点的数据类型 4Definition 以DTD或XML模式给出的节点的定义(只读) 5Doctype 指定文档类型节点(只读) 6documentElement 返回文档的根元素(可读写) 7firstChild 返回当前节点的第一个子节点(只读) 8Imple
dom节点操作属性.方法,网上收集整理. 注意大小写一定不能弄错. 属性: 01 Attributes 存储节点的属性列表(只读) 02 childNodes 存储节点的子节点列表(只读) 03 dataType 返回此节点的数据类型 04 Definition 以DTD或XML模式给出的节点的定义(只读) 05 Doctype 指定文档类型节点(只读) 06 documentElement 返回文档的根元素(可读写) 07 firstChild 返回当前节点的第一个子节点(只读) 08 Imp
先来看一段代码: &!-- lang: js --& var iCurId, nItem, nFragment = document.createDocumentFragment(); for(var i=0,j=aResPat. j&i; i++){ nItem = document.createElement(&tr&), iCurId1 = aResPat[i].ID, nItem.setAttribute(&data-patid&quo
document属性作为window对象的一个子对象被创建,是用于访问页面中所有元素的对象,这里简单整理下,方便学习js的朋友 javascript中window.document的属性.方法和事件的总结,有需要的朋友可参考一下本文章. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节点的定义(只读) Doctype 指定文档类型节点(只读) d
经常用到对xml的操作,Java里面有dom和dom4j等工具类,但是Javascript就没有,所以自己写了一个,目前算作第一个版本吧.肯定还有很多地方需要改进,如果有需要用的朋友,可以把bug和需要完善改进的地方留言或评论. demo用了点extjs的东西,主要是为了打印json数组出来. js code(XmlUtils.js): /**/ function XmlUtils (config) { /*定义私有属性*/ this.isIE = !!(window.attachEvent &
本篇文章主要是对js与jquery获取父级元素,子级元素,兄弟元素的实现方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 先说一下JS的获取方法,其要比JQUERY的方法麻烦很多,后面以JQUERY的方法作对比 JS的方法会比JQUERY麻烦很多,主要则是因为FF浏览器,FF浏览器会把你的换行也当最DOM元素 原生的JS获取ID为test的元素下的子元素.可以用: 比如: &div id=&dom&& &div&&/div& &di
函数的引用, 对于内存的开销分析,需要的朋友可以参考下 请看如下代码: var arr = []; var cc = function(){alert('xx');}; for(var i = 0; i&2; i++){ arr[i] = function(){alert('yy');} arr[i+10] = } console.group('开始') console.group('1') console.info( arr[0] == arr[1]); console.info( a
本篇文章,小编为大家介绍,关于在javascript中关于节点内容加强的问题 一.元素节点 //测试元素节点,输出节点名称,节点的类型,节点的值 var liElements=document.getElementsByTagName(&li&); for(var i=0;i&liElements.i++){ alert(liElements[i].nodeName); alert(liElements[i].nodeType); alert(liElements[
七.AJAX开发 到这里,已经可以清楚的知道AJAX是什么,AJAX能做什么,AJAX什么地方不好.如果你觉得AJAX真的能给你的开发工作带来改进的话,那么继续看看怎么使用AJAX吧. 7.1.AJAX应用到的技术 AJAX涉及到的7项技术中,个人认为Javascript.XMLHttpRequest.DOM.XML比较有用. A.XMLHttpRequest对象 XMLHttpRequest是XMLHTTP组件的对象,通过这个对象,AJAX可以像桌面应用程序一样只同服务器进行数据层面的交换,而
第四章 凭证安全存储 到现在为止,我们已经将JBCP Pets站点做了一些用户友好性方面的升级,包括一个自定义的登录页.修改密码以及remember me功能. 在本章中,我们将会把到目前为止都在使用的内存存储转移到数据库作为后台的认证存储.我们将会介绍默认的Spring Security数据库schema,并介绍自定义扩展JDBC实现的方式. 在本章的课程中,我们将会: 理解如何配置Spring Security才能使用JDBC访问数据库服务以实现用户的存储和认证: 学习如何使用基于内存数据库
从MOsky的博客阅读此文 引言 本人学习Node.js已有两周了,有点心得,写成文章,一方面便于今后自己查阅,另一方面巩固自己所学.如有错误,请诸位赏脸批评指教. Node.js给我的第一印象就是,它的I/O操作是非阻塞的.非阻塞I/O带来了性能上的优势.与Java的阻塞式I/O操作做对比,Java程序需要从网络下载资源的时候,阻塞线程,当查询数据库的时候,阻塞线程,当读取文件的时候,阻塞线程.诸如此类的来自I/O的阻塞将浪费不少CPU的时间.如果心疼这些浪费的时间,那好,你就多开几个线程或进
AJAX之旅(1):由prototype_1.3.1进入javascript殿堂-类的初探 还是决定冠上ajax的头衔,毕竟很多人会用这个关键词搜索.虽然我认为这只是个炒作的概念,不过不得不承认ajax叫起来要方便多了.所以ajax的意思我就不详细解释了. 写这个教程的起因很简单:经过一段时间的ajax学习,有一些体会,并且越发认识到ajax技术的强大,所以决定记录下来,顺便也是对自己思路的整理.有关这个教程的后续,请关注http://www.x2design.net 前几年,javascrip
本文应用了很多实例,来解读JavaScript中BOM和DOM,DOM是一个使程序和脚本有能力动态地访问和更新文档的内容.结构以及样式的平台和语言中立的接口.,而BOM定义了JavaScript可以进行操作的浏览器的各个功能部件的接口. js组成 我们都知道, javascript 有三部分构成,ECMAScript,DOM和BOM,根据宿主(浏览器)的不同,具体的表现形式也不尽相同,ie和其他的浏览器风格迥异. 1. DOM 是 W3C 的标准: [所有浏览器公共遵守的标准] 2. BOM 是
不得不自已写一个.XML 的操作一直没有用过.下面是自己搜集的XML操作类 DOMDocument相关的内容. 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节点的定义(只读) Doctype 指定文档类型节点(只读) documentElement 返回文档的根元素(可读写) firstChild 返回当前节点的第一个子节点(只读) Imple
parentNode--父节点;firstChild--第一个子节点;lastChild--最后一个子节点;previousSibling--紧挨着的前面的兄弟节点;这样就可以作短途旅行,访问当前节点的某些相关节点,感兴趣的你可以参考下哈 在javascript中对文档中每个节点都有 parentNode--父节点 firstChild--第一个子节点 lastChild--最后一个子节点 previousSibling--紧挨着的前面的兄弟节点 nextSibling--紧挨着的后面的兄弟节点
本文正在翻译中,原文请参考 Migrate apps from Internet Explorer to Mozilla 简介 当Netscape最初推出Mozilla浏览器的时候, 特别考虑对W3C标准的支持. 所以Mozilla并不对Netscape Navigator 4.x 和微软IE遗留的源码做向后支持. 例如, Mozilla不支持&layer&, 我在后面会进行讨论. 那些像IE4一样, 在W3C标准概念之前开发的浏览器遗留了很多毛病. 在这篇文章里, 我将描述Mozilla的&
#include &stdafx.h& #include &YuyinTree.h& #include &YuyinTreeDlg.h& #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////
将数据保存到SQL数据库中(Saving Data in SQL Databases) 把经常重复使用的或者结构化的数据保存到一个数据库中是比较合适的,例如联系人信息(通讯录).这一课,我们假定你熟悉一般的SQL数据库,并帮助你开始在Android系统中使用SQLite数据库.你在Android上使用数据库可能用到的API,都包含在android.database.sqlite包里. Define a Schema and Contract 一个SQL数据库的主要原则是图式:正式宣布如何组织数据
DOM2与DOM3主要是在DOM1的基础上引入更多的交互能力,支持了更高级的XML特性. DOM2做的主要的扩展子集具体为: DOM Level 2 Core:在一级核心的基础上,为节点添加了更多的方法和属性. DOM Level 2 Views:为文档定义了基于样式信息的不同视图 DOM Level 2 Events:说明了如何使用事件与DOM进行交互. DOM Level 2 Style:定义了如何以编程的方式来访问和改变CSS样式的信息 DOM Level 2 Traversal and
这篇文章主要介绍了python操作xml文件详细介绍,着重介绍了获取XML标签的属性和值的方法,需要的朋友可以参考下 关于python读取xml文章很多,但大多文章都是贴一个xml文件,然后再贴个处理文件的代码.这样并不利于初学者的学习,希望这篇文章可以更通俗易懂的教如何使用python 来读取xml 文件. 一.什么是xml? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. abc.xml &?xml version=&1.0&
我不想教各位新手什么高级技术,因为我也在研究,只是想教大家一个思考的方向,能够具有举一反三的能力,能够真正学会Ext和开始深入了解. 如果你想实现什么特效,这个文字不适合你,但如果你想Ext文章,我想鄙人的小文非常适合你. 另:这篇教程是建立在Ext2.2上的.这个很多教程都没说明.让人很糊涂.我在此特别说明 网上很多教程,但是实际使用并不是很多,我想作为一个星期一个星期的总结来给各位网络上的朋友带来帮助.希望各位有用.我会从每个细节都说明,尽量不漏掉作为初学者需要知道的基础知识.第一次写教程,
JQuery选择器之三 首先老规矩提供我学习用的例子 &!DOCTYPE html PUBLIC &-//W3C//DTD XHTML 1.0 Transitional//EN& &http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&& &html xmlns=&http://www.w3.org/1999/xhtml&& &head& &met
本篇文章是对链表的各类操作进行了详细的分析介绍,需要的朋友参考下 链表概述链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个&头指针&变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称为&结点&,每个结点都应包括两个部分:一为用户需要用的实际数据,二为下一个结点的地址.因此,head指向第一个元素:第一个元素又指向第二个元素:--,直到最后一个元素,该元素不再指向其它元素,它称为&quo
使用XMLHttpRequest对象的responseXML的方式来接受XML数据对象的DOM对象 摘要:本节补充ajax学习笔记1中 第二种方式:使用XMLHttpRequest对象的responseXML的方式来接受XML数据对象的DOM对象 在ajax学习笔记1中已经对准备工作和需要用到的知识做了比较详细的介绍,本节主要介绍需要修改的代码以及新增的代码 .新增一个servlet类 AJAXXMLServer.java import javax.servlet.http.HttpServle
这篇文章主要介绍了JavaScript的DOM基础知识,需要的朋友可以参考下 DOM(Document Object Model)即文档对象模型,针对HTML和XML文档的API(应用程序接口); DOM描绘了一个层次化的节点树,运行开发人员可以添加/移除和修改页面的某一部分; 一 DOM介绍 D(文档):可以理解为整个Web加载的网页文档; O(对象):可以理解为类似window对象之类的东西,可以调用属性和方法,这里说的是document对象; M(模型):可以理解为网页文档的树形结构; 1
在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询 XML作用 对于XML,想必各位都比较了解,我也就不用费笔墨来描述它是什么了,我想在未来的Web开发中XML一定会大放异彩,XML是可扩展标记语言,使用它企业可以制定一套自己的数据格式.用于Internet的数据传输,我想,这是XML对于我们这些程序员最诱人的地方! 我们今天的主题不是论述XML的好处,而是讨论在
传统的数据库管理系统把所有数据都放在磁盘上进行管理,所以称作磁盘数据库(DRDB: Disk-ResidentDatabase).磁盘数据库需要频繁地访问磁盘来进行数据的操作,磁盘的读写速度远远小于CPU处理数据的速度,所以磁盘数据库的瓶颈出现在磁盘读写上. 基于此,内存数据库的概念被提出来了.内存数据库(MMDB:MainMemoryDatabase,也叫主存数据库)[1],就是将数据全部或者大部分放在内存中进行操作的数据库管理系统,对查询处理.并发控制与恢复的算法和数据结构进行重新设计,以更
PHP DOMDocument操作 XML类 属性.方法 | 属性: Attributes 存储节点的属性列表(只读) childNodes 存储节点的子节点列表(只读) dataType 返回此节点的数据类型 Definition 以DTD或XML模式给出的节点的定义(只读) Doctype 指定文档类型节点(只读) documentElement 返回文档的根元素(可读写) firstChild 返回当前节点的第一个子节点(只读) Implementation 返回XMLDOMImpleme
很多时候我们需要用到带复选框checkbox的树. 其实加个checkbox框简单,只需要在返回来的json数据中加上 checked 项(为true/false).要实现我们想要的选中父节点的checkbox后,自动选中子节点也很简单,只需要加上下面这一段代码就可以了. tree.on('checkchange', function(node, checked) { node.expand(); node.attributes.checked = node.eachChild
compute-2的作用就是compute-1的备机,注意是备机,因为compute-2如果也运行vm实例的话,实例会保存在/var/lib/nova/instance中,这样当compute-1宕机的时候,需要把共享存储挂载过来的时候会发现无处可挂载,这种情况可以通过不使用iscsi模拟共享存储,而使用NFS来实现,但是NFS在运行多个vm实例时IO性能上差很多. 按照计算节点的设置方法把compute-2设置一遍,做到第19步即可. 1 查看compute-2上的服务是否正常 nova-ma
12.1 链表 链表中的每个节点通过链或指针连接在一起.程序通过指针访问链表中的节点.通常节点是动态分配的,但有时也有节点数组构建的链表,但依旧通过指针来遍历链表的. 12.2 单链表 typedef struct NODE { struct NODE * }N 链表中的节点可能分布于内存中的各个地方.节点在物理上相连与否并不重要,因为程序始终用链(指针)从一个节点移动到另一个节点. 12.2.1 在单链表中插入 #include &stdio.h& #
DOM1 级主要定义的是 HTML 和 XML 文档的底层结构. DOM2 和 DOM3 级则在这个结构的基础上引入了更多的交互能力,也支持了更高级的 XML 特性. 12.1 DOM变化 12.1.1 针对XML命名空间的变化 命名空间要使用xmlns特性来指定.XHTML的命名空间是http://www.w3.org/1999/xhtml,在任何格式良好的XHTML页面中,都应该将其包含在&html&元素中. 1.Node类型的变化 在DOM2级中,Node类型包含下列特定于命名空间的属性
对 DOM 的两个主要的扩展是 Selectors API( 选择符 API) 和 HTML5 . 11.1 选择符API Selectors API是由W3C发起制定的一个标准,致力于让浏览器原生支持CSS查询.所有实现这一功能的JavaScript库都会写一个基础的CSS解析器,然后再使用已有的DOM方法查询文档并找到匹配的节点. 11.1.1 querySelector()方法 querySelector方法接收一个CSS选择符,返回与该模式匹配的第一个元素,如果没有找到匹配的元素,返回n
一段递归删除一个部门以及它的所有子部门的一段代码.仅供大家参考和自己以后备用 有的时候删除信息的时候,需要把这条信息下的所有的都删除,这个时候就需要递归删除了.下面是我在做部门管理中的删除部门功能的时候写的一段递归删除一个部门以及它的所有子部门的一段代码.仅供大家参考和自己以后备用. 下面是我的一段代码的展示: /* * 修改一条部门信息 */ function del($bumen_id){ $sql=&select bumen_id from lxsm_bumen where topbume
在android中,操作xml文件,一般有几种方式:SAX操作,Pull操作,DOM操作等.其中DOM的方式,可能是大家最熟悉的,也是符合W3C标准的 XML作为一种业界公认的数据交换格式,在各个平台与语言之上,都有广泛使用和实现.其标准型,可靠性,安全性......毋庸置疑.在android平台上,我们要想实现数据存储和数据交换,经常会使用到xml数据格式和xml文件. 小提示:android中存储数据一般有如下几种:SharedPreferences(参数化),XML文件,sqllite数据
C#对XML文件的各种操作实现方法,需要的朋友可以参考一下 XML:Extensible Markup Language(可扩展标记语言)的缩写,是用来定义其它语言的一种元语言,其前身是SGML(Standard Generalized Markup Language,标准通用标记语言).它没有标签集(tag set),也没有语法规则(grammatical rule),但是它有句法规则(syntax rule). 任何XML文档对任何类型的应用以及正确的解析都必须是良构的(well-forme
2级DOM定义了一个createRange()方法,如果是按照DOM此标准的浏览器(IE并不是支持此标准的,但是IE里的属性或方法却远比标准中定义的多得多),它属于document对象,所以创建一个range对象要这样做: var oRange = document.createRange(); 如果你要检测你的浏览器是否支持此标准Range对象,可以用hasFeature()方法来检测: var supportsDOMRanges = document.implementation.hasFe
在发送请求时,返回类型为text和xml的XHR没什么区别,区别在于回调函数处理返回数据的方式 示例代码: //回调函数 function callback() { //alert(xmlhttp.readyState); //5.接收响应数据 //判断对象的状态是交互完成 if (xmlhttp.readyState == 4) { //判断http的交互是否成功 if (xmlhttp.status == 200) { //使用responseXML的方式来接收XML数据对象的DOM对象 v
首先废话一句,jQuery选择器真心很强大!接下来详细介绍jQuery 选择器项目实例实现方式 首先废话一句,jQuery选择器真心很强大! 在项目中遇到这么一个问题easyui的问题 如图所示,当前页面显示的是&原始报文查询&的页面,当时左侧导航栏却选中的是&重发报文查询&.如何让右侧的菜单和左侧的导航实现联动即:左侧点击&原始报文查询&,那么右侧的&补发运抵报文&展开,并选中&原始报文查询&,&quot
在我们迎来了麦克卢汉一百周年之际,又送走了苹果的创始人史蒂夫?乔布斯.麦克卢汉?然不可能见过乔布斯,而从乔布斯的言行来看,对麦克卢汉想必也很陌生.然而,时或空都没有交集的学术重镇和商界领袖之间,却出现了惊人的一致性. &媒介即信息&又一参考个案:手机 虽然麦克卢汉有着&媒介即信息&之类的断语,但国内媒介环境学当仁不让的译介大师,深圳大学的何道宽教授坚持认为麦克卢汉不是&技术决定论者&.不过,曾经给莱文森留言否认自己是媒介决定论的麦克卢汉应该自己都
Copyright (C) , All Rights Reserved.
版权所有 闽ICP备号
processed in 0.054 (s). 11 q(s)[C/C++基础知识] 那些被遗忘的链表知识
时间: 18:57:35
&&&& 阅读:488
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&最近快毕业了,复试又复习了一些知识.其中就包括那些被遗忘的链表知识,而它又是C语言中非常重要一个知识点.同时发现很多同学都会忘记该知识,所以通过这篇文章一方面帮助大家回忆链表知识,同时对刚接触C语言的同学也有帮助.我采用问答的方式回顾那些知识,希望能接受!
提示:该文章引用李凤霞(北理)的《C语言程序设计教程》及课件和谭浩强(清华)的《C程序设计》.
一.链表基本概念
1.什么是链表?
链表是一种常见的动态进行存储分配的数据结构.
2.为什么会出现链表这种结构呢?
(1).C语言中使用数组存放数据时,须先定义固定数组长度,确定元素个数.如果数据超过其容量就会发生数组溢出;为防止该溢出,往往会定义很大的数组,但这样又造成资源空间浪费.如果程序采用动态数组方法复制增长的数据,方法可行但效率太低;
(2).如果在数组中需要删除一个数据或插入一个数据时,此时需要将删除或插入点数组后面的数据依次移动,这样的移动也会导致程序效率非常低.
3.此时,链表这种动态存储数据的结构油然而生.你是否看到了数组与链表两者一些简单区别呢?那么链表的基本单位又是什么呢?
结点是链表的基本存储单位,在链表中所有元素都存储在一个具有相同数据结构的结点中.一个结点对应一组数据元素,每个结点在内存中使用一块连续的存储空间(一个结点可由多种数据域组成),每个结点之间使用不连续的存储空间,结点之间通过指针链接.结点由数据域和指针域/链组成.常用定义如下:
struct node
struct node *
//指针域:指向node结点指针
4.知道了链表的基本存储单位后,那链表的基本组成部分是什么呢?
链表一般由三部分组成:
(1).表头指针:指向链表头结点的指针,头指针是链表的标志,通常用head定义头指针;
(2).表头结点:链表的第一个结点,一般不保存数据信息.链表中可没有表头结点(后面讲述),它是为方便引入结点.
(3).数据结点:实际保存数据信息的结点.示意图如下:
5.前面讲到可能链表中没有表头结点,那么链表常见形式有哪些呢?
常见的形式包括:有表头结点的单向链表、无表头结点的单向链表、有表头的单向循环表、无表头的单向循环表.其中有表头与无表头的差别在于是否有表头结点,插入删除操作对应不同的判断;单向链表与单向循环链表的区别在于最后一个数据结点指针是NULL还是指向表头结点.双向链表即两个指针分别指向前一个位置和后一个位置的链表.
6.那么链表中的常见操作包括哪些呢?
链表的常见操作包括:建立链表、遍历链表、求链表表长、插入数据、删除结点.下面将详细解决.
二.链表基本操作
1.建立链表
建立链表前先定义一个包含数据域与指针域的结构类型,然后建立指向表头结点的头指针head,通过malloc函数动态申请内存作为表头结点.其中void *malloc(int size)的头文件为&stdlib.h&.动态分配长度size字节存储区.//定义结构类型
typedef struct node
char name[20];
struct node *
NODE *head,*p;
//说明指针
//建立空链表(仅表头结点)
p=(NODE *)malloc(sizeof(NODE));
p-&next=NULL;
//插入一个数据结点
p=(NODE *)malloc(sizeof(NODE));
gets(p-&name);
//输入姓名
p-&next=head-&
//p指向下一个结点=head指向下一个及诶单
head-&next=p;
//p结点插入表头结点head后上面代码的执行过程如下图所示:
如果想通过函数实现建立链表的代码如下://建立n个结点的链表
void create(NODE *head,int n)
for(;n&0;n--)
p=(NODE *)malloc(sizeof(NODE));
gets(p-&name);
p-&next=head-&
head-&next=p;
}但是需要注意:通过此种方法建立时,总是在head后插入一个新的结点,这就导致最终插入的顺序为输入顺序的逆序存储该n个结点的信息.如果想顺序插入,只需要让head结点指向第一个插入结点p,第一个指向第二个,依次最后一个结点指向NULL即可.在约瑟夫循环中我将讲述.
2.遍历链表
遍历链表中某个结点,即从链表第一个结点开始依次进行查找通过output函数可以实现,如果想具体增加一些遍历条件可以在函数中添加,下面output函数依次输出学生姓名.//遍历输出结果
void output(NODE *head)
//含表头结点
while(p!=NULL)
puts(p-&name);
}如果想计算链表的长度,如果含表头结点时,从第一个结点开始依次遍历,没找到一个结点其长度加1,直到链表尾.如果链表为空时,表头结点head-&next==null.此时返回的为0即可.//计算链表长度
int count(NODE *head)
int number=0;
while(p!=NULL)
自定义main函数调用其函数,程序测试结果如下图所示,是不是反序一目了然.
3.插入数据
在链表中第i个结点后面插入一个新节点的算法如下:
(1).定位第i个结点.让指针q指向第i个结点,指针p指向要插入的结点.
(2).链接后面的指针:p-&next=q-&next.
(3).链接前面指针:q-&next=p.
如下图所示过程:
具体代码如下图所示,其中采用insert函数插入新结点时,可能遇到两种特殊情况:其一是向空表中插入新节点,其二是向链表最后一个元素后面插入一个新结点.
//插入新结点 head头指针 p插入指针 i位置
void insert(NODE *head,NODE *p,int i)
int n = 0;
//第一步 寻找到第i个结点位置
while(n&i&&q-&next!=NULL)
q = q-& n++;
//第二步 链接后面的指针
p-&next = q-&
//第三步 链接前面的指针
4.删除数据
在链表中可以删除任意一个数据结点,其中删除链表中第i个结点的算法如下:
(1).定位第i-1个结点位置.指针q指向第i-1个结点,指针p指向被删除结点.
(2).摘链:q-&next=p-&next.
(3).释放结点p:free(p).
其中void free(void *p)释放p所指向的内存空间,头文件为&stdlib.h&.如下图所示:
具体代码如下图所示,同时通常在删除结点p后,需要把q指向的下一个新的结点赋值为p,可以继续执行删除操作.
//删除第i个结点
void delete_node(NODE *head,int i)
NODE *q,*p;
int n = 0;
//第一步 寻找到第i-1个结点位置 q指针指向
while(n&i-1&&q-&next!=NULL)
if(q-&next!=NULL)
//第二步 摘链 q指向p的下一个结点
q-&next = p-&
//第三步 释放结点
希望读者思考一个问题,在删除结点时,如果链指针摘链操作后没有free释放掉该结点,会导致什么结果呢?如果你学过C++或Jave,你又能回忆起它的内存管理和泄露知识吗?
三.链表经典问题-约瑟夫循环问题
通过上面对链表的讲述,你是否能回忆起一些它的简单知识呢?下面我想通过链表知识中最经典的题目&约瑟夫循环问题&让我们看看链表如何在实例中应用.
题目:有N个孩子围成一圈并依次编号(从1起),老师指定从第M个孩子开始报数,当报到第S个孩子时出列,然后下一个孩子从1开始继续报数,依次出列.求孩子出列的顺序或求最后一个孩子的编号.
输入:输入n(孩子个数),m(开始报数编号),s(报s出列).
输出:孩子出列顺序或最后一个孩子编号.
分析:如下图所示,当输入n=5,m=2,s=3时表示总共有5个孩子,通过单向循环链表围成一圈,m=2表示从第二个孩子开始报数,第二个孩子报数1,第三个报数2,第四个孩子报数3(s=3)出列.依次出列顺序为:4-2-1-3-5.
完成该程序需要:
(1).建立单向循环链表.注意此时建表是顺序建立,前面讲述的在head后插入新结点为逆序建表.此时需要依次插入head-&a1-&a2.最后在让q-&next=head构建循环链表.(代码无表头结点)
(2).通过循环找到开始报数的结点,p指向开始报数的结点,q指向其前一个结点,因为删除p时需要通过前一个结点q摘链.
(3).循环依次报数删除结点,知道p=p-&next退出循环,此时仅剩最后一个结点.
#include&stdio.h&
#include&stdlib.h&
//定义结构
typedef struct node
struct node *
int main()
int i,j,k;
int n,m,s;
//n个孩子 从m个开始报数 s个出列
NODE *head,*p,*q;
//头结点 p插入结点 q插入前一个结点
printf(&请输入数字:\n&);
scanf(&%d %d %d&,&n,&m,&s);
//建表 顺序插入无表头单向循环链表
head=NULL;
for(i=1;i&=n;i++)
//i存储序列号
p=(NODE*)malloc(sizeof(NODE));
if(head==NULL) head=p;
//第一个结点存入head
else q-&next=p;
//q链接新插入结点p
//新插入结点构成链尾
//链尾链接链头构成循环
//寻找输出的位置m p为开始的结点 q为其前面一个结点
for(k=1;k&m;k++)
//如果m=1 即第一个位置
while(q-&next!=p)
//寻找q指针 q为p的前一个结点
//删除结点及输出
printf(&输出删除结点顺序:\n&);
while(p-&next!=p)
//寻找到要删除结点位置
for(j=1;j&s;j++)
//输出结点并删除
printf(&%d &,p-&no);
q-&next=p-&
printf(&\n最后剩余结点:%d\n&,p-&no);
system(&PAUSE&);
测试用例及输出结果如下所示:
(1).输入n=5 m=2 s=3
(2).输入n=35 m=5 s=3
如果你是一位刚接触C语言的同学,希望文章能令你对链表有些认识;
如果你是考研或找工作的同学,希望对你在面试题或考研题中有所帮助;
如果你对链表有很深入的认识,希望当你阅读该文章时能对我这样的年轻人慧心一笑;
最后希望该文章对大家有所帮组,同时如果文章中有错误或不足之处,还请海涵!同时感谢母校BIT及老师,四年转瞬即逝,还有很多知识需要学习.这篇文章仅仅是自己对链表知识的一些总结及在线笔记,请尊重作者的劳动果实!
(By:Eastmount
夜2点 原创CSDN)标签:&&&&&&&&&原文:http://blog.csdn.net/eastmount/article/details/
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!

我要回帖

更多关于 结点关联杆件均为虚梁 的文章

 

随机推荐