双链表的插入排序算法

偏执的太偏执、 2022-04-13 10:59 316阅读 0赞
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. typedef struct Node{
  4. int data;
  5. struct Node *llink,*rlink;
  6. }*DLinkList;
  7. void INSLINKLIST(DLinkList list){
  8. DLinkList save,p,q,r;
  9. p=list->rlink->rlink; //从头结点的第二个结点开始插入
  10. while(p!=list){
  11. q = p->llink; //q指向本次排序的起始位置
  12. save = p->rlink;//保存下一趟插入的开始起始位置
  13. r = save;
  14. while(q!=list && p->data<q->data){
  15. if (r==save) //只要执行这一步,就说明p结点小于q结点,所以跟定不是q结点的后继,所以需要先把p结点剪出来
  16. {
  17. r->rlink = q; //将结点p剪出来,让p的前驱和p的后继直接连接成一条链,方便以后遇到合适的直接插入,而不用再删除p结点
  18. q->llink = r;
  19. }
  20. r = q;
  21. q=q->llink;
  22. }
  23. if (r!=save)//寻找插入位置
  24. {
  25. r->llink = p;
  26. q->rlink = p;
  27. p->llink = q;
  28. p->rlink = r; //将p结点插入q结点与r 结点之间
  29. }
  30. p = save;
  31. }
  32. }

发表评论

表情:
评论列表 (有 0 条评论,316人围观)

还没有评论,来说两句吧...

相关阅读

    相关 插入排序算法

    如果数据存储在一段连续的内存上,比如数组中,插入排序算法的实现相信大家都已经非常熟悉,如果要对一个单链表进行插入排序,将会牵扯到大量指针操作。 同时,如果在实现的过

    相关 双向循环插入排序

    前两篇博文,我讨论了链表的冒泡排序和选择排序(以Linux内核链表为例),这篇文章,我想说说插入排序。 一、复习数组的插入排序 插入排序在算法思想中属于“减治法”。