各种对单链表排序的方法:
/*
**对给定单链表进行排序,函数参数为指向链表第一个节点的指针
*/
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
typedef struct NODE{
struct NODE *next;
int value;
}Node;
/*
**选择排序法,每次从当前遍历中找到最小值
*/
int listSort1(Node **first)
{
Node *current,*p,*q;
int temp;
for(current = *first;current != NULL;current = current->next)
{
q = current;
for(p = current->next;p != NULL;p = p->next)
{
if(p->value < q->value)
{
q = p; //q为当前遍历中,value值最小的指针
}
}
if(q->value != current->value)
{
temp = current->value;
current->value = q->value;
q->value = temp;
}
}
return TRUE;
}
/*
**冒泡排序法,每次得到链表中的一个最大值
*/
int listSort2(Node **first)
{
Node *current,*p,*q;
int i,j = 0,temp,nodeCount = 0,order = 1 ;
for(current = *first;current != NULL;current = current->next)
nodeCount++;
for(i = 0;i < nodeCount-1;i++)
{
p = *first;
for(j = i;j < nodeCount-1;j++)
{
q = p->next;
if(p->value > q->value)
{
temp = p->value;
p->value = q->value;
q->value = temp;
order = 0;
}
p = q;
}
if(order)
break;
}
return TRUE;
}
/*
**测试用,在主函数里建一个无序链表,然后对其排序
*/
int main(void)
{
Node *head,*newNode,*temp;
int newValue,count = 5; //测试用的整数个数
head = NULL;
printf("请输入%d个整数:\n",count);
scanf("%d",&newValue);
head = (Node*)malloc(sizeof(Node));
head->value = newValue;
head->next = NULL;
temp = head;
while(--count)
{
scanf("%d",&newValue);
newNode = (Node*)malloc(sizeof(Node));
newNode->value = newValue;
newNode->next = NULL;
temp->next = newNode;
temp = newNode;
newNode = NULL;
}
temp->next=NULL;
listSort2(&head);
printf("排序后的链表为:\n");
while(head)
{
printf("%d ",head->value);
head = head->next;
}
printf("\n");
return TRUE;
}