算法 -- 链表插入排序

本文介绍了如何使用链表进行插入排序,通过生成0到999的随机数建立链表,然后重新排列节点以实现升序排序。关键步骤包括:1. 当B链表为空时,将新节点作为头节点;2. 比较待插入节点与已排序节点,若小于已排序节点则插入;3. 若待插入节点大于已排序节点,更新指针以保持排序顺序。

问题: 这个代码产生0 ~ 999之间的N个随机数,构建每个节点代表一个数的链表,然后重新排列这些节点,使之按照顺序出现。

 

分析:

  • 1、b链表为空时,  x = b;       x->next = NULL;    t->next = NULL;   x->next = t;

                           

  • 2、待插入的数比已连接上的数小    即走到break;  退出循环   t->next = x->next;  x->next = t;

       

  • 3、待插入的数比已连接上的数大  ,即走到 x->next = NULL; 自动退出循环  t->next = x->next = NULL; x->next = t;

      

#include <stdio.h>
#include <stdlib.h>

typedef struct node *link;

struct node
{
    int     item;
    link    next;
};

int N;

void test_print(link head)
{
    int i;
    link p = head;

    for (i = 1; i < N + 1; i++)
    {   
        printf("%d ", p->item);
        p = p->next;
    }   
    printf("\n");
}

int main(int argc, const char *argv[])
{
    int i;
    struct node heada, headb;  
    link t, u, x, a = &heada, b;

    if (argc != 2)
    {   
        printf("Usage: a.out <N>\n");
        return -1; 
    }   

    N = atoi(argv[1]);

    // 创建链表并填充数据
    for (i = 0, t = a; i < N; i++)
    {   
        t->next = malloc(sizeof *t);
        t = t->next;
        t->next = NULL;
        t->item = rand() % 1000;
    }   
    test_print(heada.next);

    // 执行排序插入
    b = &headb;
    b->next = NULL;
    for (t = a->next; t != NULL; t = u)
    {   
        u = t->next;
        for (x = b; x->next != NULL; x = x->next)
            if (x->next->item > t->item)
                break;
        t->next = x->next;
        x->next = t;
    }

    test_print(headb.next);

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值