用插入排序做了一下
#include typedef struct data
{
int value;
struct data *next;
}data;
int sort_link(data **op_list)
{
data *p1 = NULL; // 当前待排序的节点
data *p2 = NULL; // 待排序链表表头
data *q = NULL; // 有序链表表头
data *t1 = NULL; // 插入节点的前一个节点
data *t2 = NULL; // 插入节点的后一个节点
// 入参检查
if (NULL == op_list || NULL == *op_list)
{
return -1;
}
p1 = *op_list;
while (NULL != p1)
{
p2 = p1->next; // 记录待排序链表下一个节点的位置
p1->next = NULL; // 把当前节点从链表中分离出来
t2 = q;
while (NULL != t2)
{
if (t2->value >= p1->value)
{
t1 = t2;
t2 = t2->next;
}
else if (t2 == q)
{
// 插到有序链表的首部
p1->next = q;
q = p1;
break;
}
else
{
// 将当前节点插到t1和t2之间
t1->next = p1;
p1->next = t2;
break;
}
}
if (NULL == t2)
{
if (NULL == t1)
{
// 插入的是第一个节点
q = p1;
}
else
{
// 插到有序链表的末尾
t1->next = p1;
}
}
p1 = p2;
}
*op_list = q;
return 0;
}
// 测试函数入口
int main()
{
data *list = NULL;
data *p = NULL;
int num = 4;
for (; num > 0; --num)
{
p = (data*)malloc(sizeof(data));
p->value = num;
p->next = list;
list = p;
}
sort_link(&list);
return 0;
}