双向循环链表的两种排序(2022最新 带 注释)

1、使用双向循环链表,实现自动插入数据并且对链表进行排序

代码如下所示:

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

//定义一个结构体

typedef struct node

{

    int data;

    struct node *prev;

    struct node *next;

}node;

//初始化结构体

node *initialize(void)

{

    node *new=malloc(sizeof(node));

    if (new==NULL)

    {

        printf("malloc failure!");

        return NULL;

    }

    new->data=0;

    new->next=new;

    new->prev=new;

   

    return new;

}

// 将新节点插入到链表的尾部

void insertHead(node *head,  node *new)

{

    new->prev = head->prev;

    head->prev->next = new;

    head->prev = new;

    new->next = head;

}

//打印数据

void display(node *head)

{

    node *p;

    //遍历打印

    for(p = head->next; p != head; p=p->next)

    {

        printf("%d\t", p->data);

    }

    printf("\n");

}

//第一种排序

void sort_1(node *head)

{

    node *p=NULL,*tmp=NULL;

    int num;

    //遍历进行判断然后排序

    for (p = head->next; p != head->prev; p=p->next)

    {

        for(tmp= p->next; tmp != head; tmp=tmp->next)

        {

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

            {  

                num=p->data;

                p->data=tmp->data;

                tmp->data=num;

            }

        }

    }

}

//第二种排序

void sort_2(node *head)

{

    int i, j, len=0;

    node *p=NULL, *tmp=NULL;

    //计算个数

    for(p = head->next; p != head; p=p->next)

    {

        len++;

    }

    //如果为空,直接返回

    if(len == 0)

        return;

    //循环做判断,并做排序操作

    for (i=0;i<(len-1);i++)

    {

        p = head->next;

        for(j=0;j<(len-1-i);j++)

        {

            tmp= p->next;

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

            {  

                p->next = tmp->next;

                tmp->next->prev=p;

                p->prev->next=tmp;

                tmp->prev=p->prev;

                tmp->next=p;

                p->prev=tmp;

            }

            else

            {  

                //如果不满足上面的if条件,就继续跟下一个比较

                p=p->next;

            }

        }

    }

}

int main()

{

    //定义局部变量

    int i,sum,data;

    node *head,*new;

    //初始化一个新的结构体

    head=initialize();

   

    //随机种子

    srand((int)time(0));

    for ( i = 0; i < 10; i++)

    {

        //初始化一个新的结构体

        new=initialize();

        //生成1-100之间的随机数

        sum=(rand()%100+1);

        //赋值

        new->data=sum;

        //插入

        insertHead(head,new);

    }

    printf("排序前:");

    display(head);

    printf("排序后第一种:\n");

    sort_1(head);

    display(head);

    printf("排序后第二种:\n");

    sort_2(head);

    display(head);

    return 0;

}

 运行结果:

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值