双向链表的操作问题

题目描述

建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。)

输入

第一行:双向表的长度;
第二行:链表中的数据元素。

输出

输出双向链表中的数据元素的值。

样例输入复制

10
2 4 6 3 5 8 10 21 12 9

样例输出复制

2 3 4 5 6 8 9 10 12 21

代码

#include<stdio.h>
#include<malloc.h>
#define MaxSize 1000
typedef struct DNode
{
    int data;
    struct DNode *prior;
    struct DNode *next;
}DLinkNode;
void Create(DLinkNode*&L,int a[],int n)//尾插法
{
    DLinkNode*r,*s;
    L=(DLinkNode*)malloc(sizeof(DLinkNode));
    r=L;
    for(int i=0;i<n;i++)
    {
        s=(DLinkNode*)malloc(sizeof(DLinkNode));
        s->data=a[i];
        r->next=s;s->prior=r;
        r=s;
    }
    r->next=NULL;
}
void Sort(DLinkNode*&L)//选择排序
{
    DLinkNode *p=L->next;//p为当前访问结点
    DLinkNode *q;//q为p的后一个结点
    DLinkNode *flag;//找到最小值,记录地址为flag
    int MIN;//存每次最小的值
    while(p!=NULL)//从头开始
    {
        bool sign=false;//默认没找到
        MIN=p->data;//假设当前节点数最小
        q=p->next;//从p后一点开始
        while(q!=NULL)
        {
            if(q->data<MIN)//找到最小数,更新
            {
            flag=q;//记录最小值得地址
            sign=true;//标记找到了
            MIN=q->data;//更新最小数
        }
        q=q->next;//往后继续,看是否还有更小的数
    }
        if(sign)//如果找到,仅交换数即可,无需交换位置
        {
            flag->data=p->data;//flag节点得数变为p结点得数
            p->data=MIN;//p结点得数变为最小数
            //这样最小的数就排在最前面
        }
        p=p->next;//p结点后移一位,接着查找
    }
}
void display(DLinkNode*L)
{
    DLinkNode *p=L->next;
    while(p!=NULL)
    {
        printf("%d ",p->data);
        p=p->next;
    }
}
int main()
{
    int n,a[MaxSize];
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }
    DLinkNode*L;
    Create (L,a,n);//
    Sort(L);//排序
    display(L);//打表
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值