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

发布于:2023-01-15 ⋅ 阅读:(232) ⋅ 点赞:(0)

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;

}

 运行结果:

 

 


网站公告

今日签到

点亮在社区的每一天
去签到