思想:维持一个输入的链表(head指向这个链表),和一个输出链表(out指向这个链表),当输入链表非空时时,扫描这个链表,找出表中剩余节点中的最大节点,然后从输入表中去除这个节点,并把它插入到输出表的前面。
单链表的节点类型定义如下:
typedef struct Node
{
int item;
struct Node *next;
}ListNode,*List;
选择排序算法如下:
/****************************************链表的选择排序操作(从小到大)*********************************************/
List FindMaxPreNode(List head) /*返回当前链表中最大值节点的上一个结点(直接前驱节点)*/
{
ListNode *p=head;
ListNode *maxnode=head;//开始时假定头结点即为最大值节点
ListNode *prenode=NULL;
while(p!=NULL)//找到当前最大值结点(迭代)
{
if(p->item >= maxnode->item)
{
maxnode=p;
}
p=p->next;
}
/*找最大值结点的前驱prenode,如果第一个结点就是最大节点,那么prenode==NULL;*/
for(p=head;p!=NULL;prenode=p,p=p->next)
{
if(p==maxnode)
break;
}
return prenode;
}
List List_SelectionSort(List head) /*j进行选择排序*/
{
assert(head!=NULL);
ListNode *maxprenode;//当前最大值节点的直接前驱结点的指针
ListNode *t;
List out=NULL;//排序后的链表头指针
while(head!=NULL)
{
maxprenode=FindMaxPreNode(head);
if(maxprenode==NULL)//最大值节点的