满意答案
oz8rp4oq8e
推荐于 2017.12.16
采纳率: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分享举报