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

双向链表排序[通俗易懂]双向链表的结构体,包括一个前驱节点的指针、一个后继节点的指针以及一个存储数据的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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS 6 命令(九)——磁盘阵列RAID

    CentOS 6 命令(九)——磁盘阵列RAIDmdadm-C/dev/md0-l5-n3/dev/sd[bcd]#创建等级为5的阵列设备md0,由sdb、sdc、sdd组成mdadm-D/dev/md0#查看阵列状态。-D查看状态pvcreate/dev/md0#将虚拟磁盘做成物理卷vgcreatenz2001_vg/dev/md0#创建卷组lvcreate-L1G-nnz2001_lv…

    2022年5月2日
    104
  • SDIO接口_gmac接口是什么意思

    SDIO接口_gmac接口是什么意思文章目录SDIO信号和接口SDIO命令流程SDIO寄存器卡检测卡识别卡常用命令SDIO,全称:SecureDigitalInputandOutput,即安全数字输入输出接口。SDIO卡是在SD内存卡接口的基础上发展起来的接口,SDIO接口兼容以前的SD内存卡,并且可以连接SDIO接口的设备,目前根据SDIO协议的SPEC,SDIO接口支持的设备总类有蓝牙,网卡,电视卡等。支持三种不同…

    2022年10月4日
    5
  • ubuntu用pip离线安装python第三方库

    ubuntu用pip离线安装python第三方库1.导出依赖pip3freeze>requirements.txt2.按照依赖下载离线包pip3download-dpackagesDir-rrequirements.txt3.安装离线包whl包、tgz包单个包、目录下的包pip3install–no-index–find-links=“packages_dir”-rrequirements.txt…

    2022年8月27日
    2
  • java中scanner是什么意思_java中Scanner是什么?怎么用?

    java中scanner是什么意思_java中Scanner是什么?怎么用?在java中有一种类可以获取我们输入的信息,这也是java中的新特征,有小伙伴知道这是什么类吗?小编最近在学Scanner类,发现还需要结合正则表达式一起使用,这对我们以前知识的掌握来说,得有比较好的基础才能完成。下面我们就一起看看Scanner类如何在java中使用吧。1.概念一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。2.语法Scanners=newScanner(S…

    2022年7月21日
    15
  • coolfire黑客入门教程系列之(八)最后部分!

    coolfire黑客入门教程系列之(八)最后部分!作者glayjun@2005-06-0309:46:25我将coolfire黑客入门教程系列之(八)这篇教程为开了三部分!!这是最后的部分!!不要再问我coolfire是谁啊!!!呵呵!!我怕!!林正隆,中国台湾著名黑客,中国黑客领军人物。2011年获得COG信息安全终身成就奖林正隆-百度百科说明:本系列文章是整理Coolfire的8篇黑客入门文章,因在浏览网上相关文章的时候,要…

    2022年5月31日
    39
  • 常见模拟电路设计 一(含仿真):方波、三角波、正弦波的互相发生「建议收藏」

    FPGA最近有些整累了,给大家开个模拟电路设计的坑,内含干货,请放心食用一、总体设计方案二、单元电路设计和原理说明2.1方波发生电路波形发生电路可以由集成运放芯片构成运算电路来实现。第一步的方波发生电路,可以由滞回比较器和RC电路构成,如图采用通用运放LM324芯片进行设计,C1和R1组成RC电路,而R2和R3以及LM324构成滞回比较器。D1、D2的作用是稳压。电路波形如下2.2三角波发生电路三角波发生器就是利用集成运放构成积分器,然后对方波信号进行运算,如图其中R4和C2的值

    2022年4月7日
    133

发表回复

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

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