单链表的插入3.ppt

  1. 1、本文档共52页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
单链表的插入3

链表的排序(按照升序排列) 不同于数组,链表的排序不用改变每个节点里面的值,只需要改变节点和节点之间的连接关系。 思路1,类似选择排序,每次找出最小的,脱离原链表,插入在另一个新链表的末尾: 先把原链表中最小的元素所在的那个节点找出来,删除其在原链表的位置,自己作为新链表的第一个节点 然后在原链表中依次找到最小的那个节点,在原链表中删除,插入新链表中,插入的位置在新链表上次插入的那个节点之后。 思路2,类似冒泡排序 如果相邻元素无序,则交换,注意现在链表中交换是要改变节点的连接关系,而不是改变节点。 相邻元素交换应该为先执行删除操作,再执行插入操作 排序步骤的图示(有头节点的情况) 排序步骤的图示(有头节点的情况) void sort(struct Node **h) { struct Node *p,*h1,*q,*pmin,*pminpre,*newp; h1=(struct Node*)malloc(sizeof(struct Node));//新的头节点 newp=h1; while((*h)-next!=NULL) {//当老链表没有元素节点的时候才完毕 pmin=(*h)-next; pminpre=*h; q=pmin; p=pminpre; while(q-next!=NULL){//当老链表遍历一趟完毕,找到这一趟的最小值 q=q-next; p=p-next; if(q-datapmin-data) { pmin=q; pminpre=p; } } pminpre-next=pmin-next;//原链表中删除节点pmin newp-next=pmin;//新链表的末尾增加节点pmin newp=pmin; newp-next=NULL; } *h=h1; //老的头节点赋值为新的头节点, 想一想为什么形参要定义为Node**h 而不Node *h } 链表的排序 上述是对有头节点的链表排序 对于仅有头指针的链表(无头节点的链表)排序要稍微复杂一些,这是由于仅有头指针链表删除一个节点的时候,要区分是不是第一个节点,是第一个节点的话要修改头指针。 单链表的逆置 将一个链表逆置 思路:将原链表元素按照顺序取出来(删除和原链表脱离的关系,但并不删除节点),然后插入在新链表的第一个元素的位置上。 对于仅有头指针和有头节点两种情况程序会有些差别: 1、有头节点的时候,每次在头节点后执行插入操作即可。 2、仅有头指针的时候,每次在头指针前面插入元素,然后更新头指针。 将一个链表逆置图示(有头节点的情况) 将一个链表逆置代码(有头节点的情况) reverse(struct Node **head) { struct Node *p,*newhead,*p1; p=(*head)-next; newhead=*head; newhead-next=NULL; while( p != NULL) { p1=p; //p1为每次取出的节点 p=p-next;//读取下一个节点 p1-next=newhead-next;//插入在新链表的表头的前面 newhead-next=p1; } *head=newhead; //将新的表头赋值给形参的表头 } 将一个链表逆置(仅有头指针的情况) 思路:将原链表第一个元素取出来(删除和原链表脱离的关系,但并不删除节点),然后作为新链表的表头节点,用一个新的头指针指向它。 然后按照顺序将原链表的每个节点取出,插入在新链表头节点的前面,同时更新新链表的头节点指针指向的位置(即执行在链表的表头插入一个元素) reverse(struct Node **head) { struct Node *p,*newhead,*p1; p=*head; newhead=NULL; while( p!=NULL) { p1=p; //p1为每次取出的节点 p=p-next;//读取下一个节点 p1-next=newhead;//插入在新链表的表头的前面 newhead=p1; //更新新链表的表头位置 } *head=newhead; //将新的表头赋值给形参的表头 } 将一个链表逆置过程的图示(只有头指针情况) 两个有序单链表的合并 将两个有序链表合并 思路: 建立一个新

文档评论(0)

wangsux + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档