- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
链表的综合应用
单链表的逆置 将一个链表逆置 思路:将原链表元素按照顺序取出来(删除和原链表脱离的关系,但并不删除节点),然后插入在新链表的第一个元素的位置上。 对于仅有头指针和有头节点两种情况程序会有些差别: 1、有头节点的时候,每次在头节点后执行插入操作即可。 2、仅有头指针的时候,每次在头指针前面插入元素,然后更新头指针。 指针的应用——链表 单链表 单链表 单链表的定义 单链表的基本操作 遍历(递归和非递归遍历) 插入(插入4种情况,重点) 建立 删除 将一个链表排序 将两个有序链表合并 将一个链表逆置 约瑟夫问题 1、单链表的定义 最简单的是单链表,单链表中每个节点由两个字段组成:数据字段和指针字段,数据字段表示元素的本身信息,指针字段指明下个元素的位置。单链表用来表示线性结构。例如线性表(a1,a2,…,an)可以表示为: C语言定义链表的结构如下 typedef struct Node { int data; struct Node * next; }NODE; a1 head a2 /\ an …… 带有头节点的单链表 一般各种资料表示链表有两种,一种是带头节点的,一种是使用头指针的(不带头节点的)。 带头节点的 就是有一个专门的头节点h,它的后继指向链表的第一个元素。 使用头指针的 没有专门的头节点,只有一个指针h指向链表的第一个元素 单链表的遍历 2、链表的遍历(显示链表) 一个非递归算法 以下函数disp()用于显示头节点为*h的链表的所有节点数据域。 void disp(struct Node *h) { struct Node *p=h; printf(输出链表:); if(p==NULL) printf(空表\n); else { while (p-next!=NULL) { printf(%4d,p-data); p=p-next; } printf(%4d\n,p-data); } } 单链表的插入 3、链表的插入(头指针的情况下) 对于插入有以下几种情况 在一个空链表上插入一个元素。 (即要插入位置前方和后方均无元素) 从链表表头处插入一个元素 (即要插入的位置前方无元素,后方有元素) 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第三种情况可以按照第四种情况处理,但有一定特殊性所以将其分开 注意:产生新的节点必须用malloc或者calloc开辟空间 在空链表上插入一个元素 实现的语句: p-next=NULL; h=p; 在链表的表头插入一个元素 完成插入后 表头指针要指向新的表头节点 实现的语句: p-next=h; h=p; 在链表结尾出插入一个元素 不涉及头节点的变动 首先要用一个循环语句找到q q=h; while(q-next!=NULL) q=q-next; 然后执行插入语句: q-next=p; p-next=NULL; 在链表中间插入一个元素 这种情况不涉及头节点的变动 假如被插入位置的后方特征是 数据项为x 则可以执行循环语句 q=h; while(q-next-data!=x) { q=q-next; } 确保找到被插入地方的前方节点q ,然后执行插入语句: p-next=q-next; q-next=p; 注意语句顺序 3、链表的插入(有单独头节点的情况下) 由于增加了表头节点,不用象没有头节点的情况时,区分是否插入点在表头,所以对于插入只有两种情况 从链表结尾处处插入一个元素 (即要插入的位置后方五元素,前方有元素) 从链表的中间插入 (即要插入的位置前方和后方均有元素) 其中第一种情况可以按照第二种情况处理,但有一定特殊性(语句的顺序可以换)所以将其分开 在链表结尾出插入一个元素 首先要用一个循环语句找到q q=h; while(q-next!=NULL) q=q-next; 然后执行插入语句: p-next=NULL; q-next=p; 在链表中间插入一个元素 假如被插入位置的后方特征是 数据项为x 则可以执行循环语句 q=h; while(q-next-data!=x) { q=q-next; } 确保找到被插入地方的前方节点q ,然后执行插入语句: p-next=q-next; q-next=p; 注意语句顺序 4、链表的建立 链表的建立就是链表从无到有的过程 建立一个头节点,并指向NULL,就建立了一个空的链表 建立有n个元素的链表有三个阶段 建立
文档评论(0)