- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构C语言 第2章
图2.5 单向链表中插入结点时指针的变化情况 (a) 插入前; (b) 插入后 /*算法描述2.6*/ void InsetLList(LList L, int i, Datatype x) {LList p, s; int j=0; p= L; while (p!=NULL ji-1 ) {p=p-next; j++; } if (p= = NULL || ji-1) printf(No this position!\n); else {s=(LList) malloc (sizeof (Node) ); s-data=x; s-next=p-next; p-next=s;} } 4. 单链表的删除Delete( L, i) 该函数删除线性链表中第i个数据结点。显然,只要找到第i-1个结点修改其指针使它跳过第i个结点,而直接指向第i+1个结点即可。但要注意,删除的结点应及时向系统释放,以便系统再次利用。指针变化如图2.6所示,语句描述为 p-next=p-next-next ; 图2.6 单向链表中删除结点时指针的变化情况 其具体算法描述如下: /*算法描述2.7*/ void Delete (LList L, int i) {LList p, q; int j=0; p=L; while ( p!=NULL ji-1 ) {p=p-next; j++; } if ( p= = NULL || ji-1) printf( No this data!\n); else { q=p-next; p-next =p-next-next; free (q); } } 由于在单向链表中插入和删除结点时,仅需修改相应结点的指针,而不需移动元素,该程序的执行时间主要耗费在查找结点上,由算法2.4知访问结点的时间复杂度为O(n), 所以算法2.6和算法2.7的时间复杂度均为O(n)。 5. 单链表的建立Crt-LList(L,n) 建立线性表的链式存储结构的过程就是一个动态生成链表的过程,即从“空表”的初始状态起,依次建立各元素结点,并逐个插入链表。下面是一个从表尾到表头建立单链表的算法,其时间复杂度是O(n)。 /*算法描述2.8*/ void Crt-LList(LList h, int n) {LList p,q; int i; h=(LList)malloc(sizeof (Node) ); h-next=NULL; p=h; for(i=1;i=n;i++) {q=(LList)malloc(sizeof(Node)); scanf(%,q-data); q-next=NULL; p-next=q; p=q;} } 说明:上面算法中分别引用了Turbo C 语言的两个标准函数malloc()和free()。设p为LList 型变量,则执行 p=(LList)malloc(sizeof (Node)) 的作用是向系统申请一个Node型的结点,同时让p指向该结点;执行free(p)的作用是向系统释放一个由p所指的Node型的结点,已释放的空间可供系统再次使用。 2.5 循环链表和双向链表 2.5.1 循环链表 循环链表是另一种形式的链式存储结构。其特点是表中最后一个结点的指针域指向头结点,整个链表呈环状。从表中任意结点出发都可到达其他结点,如图2.7所示为单循环链表。 图2.7 单循环链表 (a) 非空表;(b) 空表 循环链表和单链表算法实现基本相同,差别仅在于前者算法中的循环条件是判p或p-next是否为空,而后者是判它们是否等于头指针。有时为了简化某些操作在链表中设立尾指针,而不是头指针。例如,将两个用循环链表存储的线性表合并成一个线性表,此时仅需将一个表的表尾和另一个表的表头相连即可。指针变化如图2.8所示,用语句描述为: p=A-next; A-next =B-next-next ; B-next=p; 操作只改变了两个指针值,其算法的时间复杂度均为O(1)。 图2.8 循环链表合并示意图 (a) 合并前;(b) 合并后 2.5.2 双向链表 单向链表的结点只有一个指示其直接后继的指针域, 顺着某结点的指针可很容易地访问其后诸结点。但若要访问某结点的直接前驱,前驱虽与该结点相邻却无法直达,此时需从表头出发,且寻访时要记录相关信息。为克服单向链表这种访问方式的单向性,特设计了双向链表,
您可能关注的文档
最近下载
- 1.4互联网应用的发展阶段及其特点(教学课件)-第1册信息科技同步教学(河北大学版2024新教材).pptx VIP
- 9.单位会计核算机制凭证(单位操作手册).pdf VIP
- 洗护用品采购售后服务方案.docx VIP
- 《烟草专卖行政处罚程序规定》培训与解读课件.pptx VIP
- 单位会计核算操作手册(2023).docx VIP
- 幼儿园大班课程主题活动.pdf VIP
- 2025广西公需科目考试答案(3套,涵盖95_试题)一区两地一园一通道建设;人工智能时代的机遇与挑战.pdf VIP
- 综合安防管理平台操作手册.docx VIP
- 《中国古典园林史》周维权第三版.pdf VIP
- 8.政府采购操作手册(初稿).pdf VIP
文档评论(0)