c语言三个变量排序后返回,一道c语言编程题 输入a1 a2 a3、、、a20将他们从小到排序后输出,并给出每个元素所对应原来的次序...

满意答案

02ae427d08e371d7e90d5b995e828d6d.png

oz8rp4oq8e

推荐于 2017.12.16

02ae427d08e371d7e90d5b995e828d6d.png

采纳率:40%    等级:12

已帮助:12467人

#include

#include

struct s_node

{

int i;

int j;//记录位置

s_node *next;

};

s_node * create_list(int in_n)

{

s_node *head = 0, *p;

head = new s_node;

head->i = rand();

p = head;

for (int i = 1; i < in_n; i++)

{

s_node *n = new s_node;

n->i = rand();

p->next = n;

p = n;

}

return head;

}

s_node _end_node = {0x7FFFFFFF}; // 用来标记排序时子链表的结尾

s_node * sort_list(s_node **in_list, int in_n) // 对给定链表的前n个节点排序,返回第n+1个节点

{

if (in_n == 2) // 链表有两个元素的时候,判断是否交换顺序,并截断

{

s_node *a = *in_list;

s_node *b = a->next;

s_node *r = b->next;

if (a->i > b->i)

{

*in_list = b;

b->next = a;

a->next = &_end_node;

}

else

{

b->next = &_end_node;

}

return r;

}

else if (in_n == 1) // 只有一个元素直接截断

{

s_node *r = (*in_list)->next;

(*in_list)->next = &_end_node;

return r;

}

else // 分别对前半部分和后半部分排序,然后再整合两部分

{

s_node *t = sort_list(in_list, in_n / 2);

s_node *r = sort_list(&t, in_n - in_n / 2);

s_node *p0 = *in_list, *p1 = t, *p;

// 根据大小按顺序加入整合后的链表

if (p0->i < p1->i)

{

*in_list = p0;

p0 = p0->next;

}

else

{

*in_list = p1;

p1 = p1->next;

}

p = *in_list;

for (int i = 1; i < in_n; i++)

{

if (p0->i < p1->i) // 因为rand的范围不会达到0x7FFFFFFF,这里直接这么判断就可以了,因为_end_node的i是0x7FFFFFFF。否则需要判断是否到了子链表尾部。

{

p->next = p0;

p0 = p0->next;

}

else

{

p->next = p1;

p1 = p1->next;

}

p = p->next;

}

return r;

}

}

void main()

{int k;

s_node *list = create_list(30);

for(k=1;p!=null;k++)

{

p->j=k;

p=p->next;

}

sort_list(&list, 30);

for (s_node *p = list;;)

{

printf("%d\n", p->i);

if (p->next == &_end_node)

{

break;

}

else

{

p = p->next;

}

}

}

02分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值