输入一组数,构建有序链表 (C语言实现)

要求说明

输入一组数,构建有序链表。

整体思路

用数组保存这组数,每次都去找最小值,把最小值构建结点并使用头插法插入到单链表中。 然后将该值删掉(为简便起见,把值弄成MAX)。

这里使用的是类直接插入的排序方法。

代码实现
#include <stdio.h>
#include <stdlib.h>
#define MAX 1000000
// 单链表结构体定义
typedef struct node
{
    int val;
    struct node *next;
} node;
// 顺序打印链表
void printNode(node* L)
{
    while(L->next!=NULL)
    {
        L = L->next;
        printf("%d ",L->val);
    }
}
int main()
{
    int n,i,j;
    //因为要求有序,所以每次都去数组中找最小的值
    int min=MAX;
    int min_index = -1;

    int arr[100];
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&arr[i]);
    }
    // 表头结点head 和 需要插入的结点s
    node *head,*s;
    // 生成表头结点,表头结点不存放数据
    head = (node*)malloc(sizeof(node));
    head->next = NULL;
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        {
            if(min>arr[j])
            {
                min = arr[j];
                min_index = j;
            }
        }
        // 头插法构建单链表
        s = (node*)malloc(sizeof(node));
        s->val = min;
        s->next = head->next;
        head->next = s;
        // 初始化最小值标识
        arr[min_index] =MAX;
        min = MAX;
    }
	// 输出单链表
    printNode(head);
    return 0;
}

运行结果

由于我们每次都是找最小值,故是从小到大的顺序插入。

而我们使用的是头插法,故最终结果从大到小。

所以如果想要让最终的单链表从小到大,每次都找最大值即可。

10
1 9 5 4 3 2 1 5 8 6
9 8 6 5 5 4 3 2 1 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值