数据结构实验之链表六:有序链表的建立

题目描述

输入N个无序的整数,建立一个有序链表,链表中的结点按照数值非降序排列,输出该有序链表。

输入

第一行输入整数个数N;
第二行输入N个无序的整数。

输出

依次输出有序链表的结点值。

示例输入

6
33 6 22 9 44 5

示例输出

5 6 9 22 33 44

提示

不得使用数组!

来源

思路:单向递增链表,向链表中加元素要考虑

1.比首元素小,放在首元素之前。

2.比末尾元素大,放在之后。

3.插入中间。

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <stack>
#include <set>
#include <queue>
#include <algorithm>
#define CLR(a, b) memset(a, (b), sizeof(a))
#define INF 0x3f3f3f3f
#define eps 1e-8
typedef long long LL;
using namespace std;
typedef struct Node
{
    int date;
    struct Node *next;
}node;


int main()
{
   #ifdef LOCAL
     freopen("E://in.txt","r",stdin);
   #endif // LOCAL
    int n;
    while(~scanf("%d",&n))
    {
        node *head=(node *)malloc(sizeof(node));
        head->next=NULL;
        node *pr=head;
        for(int i=0;i<n;i++)
        {
            int date;
            scanf("%d",&date);
            if(i==0)
            {
                pr->date=date;//添加第一个元素
            }
            else
            {
                node *p=(node *)malloc(sizeof(node));
                p->date=date;
                p->next=NULL;
                if(p->date<head->date)//判断要新加入的元素和头元素的大小关系
                {
                    p->next=head;
                    head=p;
                }
                else
                {
                    node *pr=head;
                    int flag=0;
                    while(pr->next)
                    {
                        node *r=pr->next;
                        if(r->date>p->date)
                        {
                            pr->next=p;
                            p->next=r;
                            flag=1;
                            break;

                        }
                        pr=pr->next;
                    }
                    if(flag==0)//没有插入,所以放在最后。
                    {
                        pr->next=p;
                    }
                }
            }
        }
        pr=head;
        while(pr->next)//打印链表
        {
            printf("%d ",pr->date);
            pr=pr->next;
        }
        printf("%d\n",pr->date);
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值