双向链表排序[通俗易懂]

双向链表排序[通俗易懂]双向链表的结构体,包括一个前驱节点的指针、一个后继节点的指针以及一个存储数据的data域,initList函数初始化单节点的双链表,addList函数采用头插入方法添加一个节点到双链表中,sort函数实现了对双链表的排序,采用头插入方式建成的双链表的头结点(存储65535的那个节点)必然在末尾(其实双链表没有首尾之说,只是把它当作末尾),排序的时候,1.首先从该节点处,每次查找前驱节点,并记录da…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

双向链表的结构体,包括一个前驱节点的指针、一个后继节点的指针以及一个存储数据的data域,initList函数初始化单节点的双链表,addList函数采用头插入方法添加一个节点到双链表中,sort函数实现了对双链表的排序,采用头插入方式建成的双链表的头结点(存储65535的那个节点)必然在末尾(其实双链表没有首尾之说,只是把它当作末尾),排序的时候,1.首先从该节点处,每次查找前驱节点,并记录data获取链表中data最大的节点,并记录指向这个节点的指针和其值。2.将此节点采用头插入的方式插入到链表中(注意要先删除这个节点在链表中的位置)3.再次从头节点处,通过前驱节点遍历整个链表(此时要去掉第一次找到的最大值)找到最大值。

typedef struct node{

    int data;
    struct node *prior,*next;
}Link;

 

void initList(Link *head){//初始化头结点

    head->next = head;
    head->prior = head;
    head->data = 65535;
}

void addList(Link *head,int data){//创建链表

    Link *tmp;
    tmp = (Link *)malloc(sizeof(Link));
    tmp->data = data;
    tmp->next = head->next;
    head->next->prior = tmp;
    head->next = tmp;
    tmp->prior= head;
}

 

void sort(Link *head){

Link *p,*tmp,*flag;

int max;

p = (Link *)malloc(sizeof(Link));

tmp = (Link *)malloc(sizeof(Link));

flag = (Link *)malloc(sizeof(Link));

tmp  = head->prior;

max = tmp->data;

flag = tmp;

p = tmp->prior;

while(p->data != 65535){//找到值最大的节点并且标记

if(p->data > max){

max = p->data;

flag = p;

flag->data = max;

}

p = p->prior;

}

if(flag->data!=head->next->data)

{//交换最大值点到头节点后

flag->prior->next = flag->next;

flag->next->prior = flag->prior;

flag->next = head->next;

flag->prior = head;

head->next->prior = flag;

head->next = flag;

}

while(head->prior->data != flag->data){

tmp = head->prior;//重新寻找时总是从表尾,也就是头结点的前驱开始。

p = tmp->prior;   //从后往前寻找

while(p->data != flag->data){//找到要交换的节点

if(p->data > tmp->data){

tmp = p;

}

p = p->prior;

}

{//交换两个节点

tmp->prior->next = tmp->next;

tmp->next->prior = tmp->prior;

tmp->next = head->next;

tmp->prior = head;

head->next->prior = tmp;

head->next = tmp;

}

}

}

主函数的调用代码就比较简单了。

int _tmain(int argc, _TCHAR* argv[])
{

    Link *head,*p;

    head =(Link *)malloc(sizeof(Link));

    p =(Link *)malloc(sizeof(Link));

    int i;

    int a[15]={7,4,2,7,5,8,6,3,2,4,5,7,98,3,4};

    initList(head);

    for(i=0;i<15;i++){

        addList(head,a[i]);

    }

    p = head->next;

    while(p->data!=65535){

        printf(“%d<–>”,p->data);    

        p = p->next;

    }

    printf(“\n”);

    sort(head);

    p = head->next;

    while(p->data!=65535){

        printf(“%d<–>”,p->data);    

        p = p->next;

    }

    printf(“\n”);
    getchar();
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183063.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hibernate和mybatisplus区别_hibernate sql

    hibernate和mybatisplus区别_hibernate sql摘抄自:《javaEE互联网轻量级框架整合开发》MyBatis因为具有封装少,映射多样化,支持存储过程,可以进行SQL优化等特点。使得它取代了Hibernate成为了java互联网中首选的持久框架。无论MyBatis或Hibernate都可以称为ORM框架,Hibernate的设计理念是完全面向POJO的,而MyBatis不是。Hibernate基本不再需要编写SQL就可以通过映射关系来操作…

    2022年9月10日
    2
  • 机器人手眼标定详解

    机器人手眼标定详解手眼标定详解研究现状所谓手眼标定是统一视觉系统和机器人的坐标系,从而可以使视觉系统所确定的物体位姿可以转换到机器人坐标系下,由机械臂完成对物体的作业。最常见的手眼系统包括Eye-to-Hand和Eye-in-Hand两种。在Eye-to-Hand手眼系统中,摄像机与机器人基座的位置是相对固定的,手眼关系式求解摄像机坐标系与机器人基座坐标系之间的转换关系。在Eye-in-Hand手眼系统中,摄像机由于固定在机械臂末端,手眼关系求解的是摄像机坐标系与机械臂末端坐标系之间的转换关系。在机器人处于不同的位置和

    2022年5月2日
    31
  • mac切换双系统按键_mac双系统开机三个盘

    mac切换双系统按键_mac双系统开机三个盘许多小伙伴都在mac电脑上安装了双系统,那么我们应该如何切换默认系统呢?相信还有很多小伙伴搞不清,那么就让我来给大家介绍一下是怎么设置默认系统的。1、开机按Option键(就是Alt键)。这个其实很简单的,就是电猫开机后,一直按着Option键,在这里我们有时候会出现一些问题就是还没按Option键,它就已经默认进入系统了,或者有时候我们按了很久,却发现屏幕一直处于灰白的状态,这两种情况几乎是我们…

    2022年10月6日
    2
  • pycharm选中一行代码快捷键_pycharm设置快捷键

    pycharm选中一行代码快捷键_pycharm设置快捷键在写代码的时候,经常为了对齐代码而烦恼,强大的pycharm为我们提供了一个代码自动对齐功能,而且可以使用快捷键完成。快捷键组合是:Ctrl+Alt+L将光标置于需要调整的代码行,或者选择一个区域,按下快捷键,代码就可以自动对齐啦!…

    2022年8月25日
    28
  • 图片批量重命名编号不要括号c语言_文件批量重命名001开始

    图片批量重命名编号不要括号c语言_文件批量重命名001开始很多人会采用传统的方法来实现,不过得到的文件名称是这样的:文件名+(编号),这样批量重命名后的文件名有括号,很多人不喜欢,所以网上很多人在网上搜索图片批量重命名不要括号的方法。如果你采用传统的方法对图片进行批量重命名操作,那么得到的图片名称中肯定会包含括号,很多小伙伴嫌这些括号很难看,不利于图片的后续查看和使用。所以今天小编就来教大家如何实现吧,我们需要借助一个批量重命名工具来帮助我们,有了这个方法之后我们就无需手动一个一个的进行修改了,批量重命名能帮助我们节省很多的时间。步骤3,进行重命名设置。…

    2025年9月14日
    9
  • 小程序常用的生命周期_小程序组件的生命周期

    小程序常用的生命周期_小程序组件的生命周期小程序的生命周期说白了就是指程序从创建、到开始、暂停、唤起、停止、卸载的过程。我们大概从三个角度看一下小程序的生命周期。(1):应用生命周期(2):页面生命周期(3):应用生命周期影响页面生命周期一:应用生命周期放一张从网上找的图:1:用户首次打开小程序,触发onLaunch(全局只触发一次)。:2:小程序初始化完成后,触发onShow方法,监听小程序显示。3:小程序从前台进入后台,触发onHide方法。:4:小程序从后台进入前台显示,触发onShow方法。5:小程序后台运行一

    2025年7月28日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号