节点排序的函数
int cmpScore( struct node_t *n1, struct node_t *n2 )
{
return n1->score - n2->score;
}
int cmpVal( struct node_t *n1, struct node_t *n2 )
{
return n1->val - n2->val;
}
void sortList( struct node_t **h,
int (*fp)(struct node_t *, struct node_t * ) )
{
struct node_t *newhead = NULL;
struct node_t *min = NULL;
struct node_t *minPrev = NULL;
struct node_t *p = NULL;
while( *h ){
minPrev = NULL;
p = *h;
min = p;
while( p->next ){
if( fp( min, p->next ) > 0 ){
minPrev = p;
min = p->next;
}
p = p->next;
}
if( min == *h ){
*h = (*h)->next;
}else{
minPrev->next = min->next;
}
min->next = newhead;
newhead = min;
}
*h = newhead;
}
节点排序完整的函数
#include <stdio.h>
struct node_t{
int idx;
int val;
int score;
struct node_t *next;
};
void showList( struct node_t *h )
{
printf("++++++++++++++++++++++++++++++\n");
while( h ){
printf("h->idx = %d, h->val = %d, h->score = %d\n",
h->idx, h->val, h->score );
h = h->next;
}
}
struct node_t* insertHead( struct node_t *h, struct node_t *n )
{
n->next = h;
return n;
}
void insertHead1( struct node_t **h, struct node_t *n )
{
n->next = *h;
*h = n;
}
struct node_t *insertTail( struct node_t *h , struct node_t *n )
{
if( h == NULL ){
return n;
}
struct node_t *p = h;
while( p->next != NULL ){
p = p->next;
}
p->next = n;
return h;
}
void insertTail1( struct node_t **h, struct node_t *n )
{
while( *h ){
h = &((*h)->next);
}
*h = n;
}
int cmpScore( struct node_t *n1, struct node_t *n2 )
{
return n1->score - n2->score;
}
int cmpVal( struct node_t *n1, struct node_t *n2 )
{
return n1->val - n2->val;
}
void sortList( struct node_t **h,
int (*fp)(struct node_t *, struct node_t * ) )
{
struct node_t *newhead = NULL;
struct node_t *min = NULL;
struct node_t *minPrev = NULL;
struct node_t *p = NULL;
while( *h ){
minPrev = NULL;
p = *h;
min = p;
while( p->next ){
if( fp( min, p->next ) > 0 ){
minPrev = p;
min = p->next;
}
p = p->next;
}
if( min == *h ){
*h = (*h)->next;
}else{
minPrev->next = min->next;
}
min->next = newhead;
newhead = min;
}
*h = newhead;
}
int main()
{
srand( time(NULL) );
int arr[] = {10,10,9,8,5,20,10,10,30,20,10,10};
struct node_t *head = NULL;
int i = 0;
struct node_t *newnode = NULL;
while( i < sizeof(arr)/sizeof(int) ){
newnode = malloc( sizeof(struct node_t) );
newnode->val = arr[i];
newnode->idx = i;
newnode->score = rand() % 100;
newnode->next = NULL;
insertTail1( &head, newnode );
i++;
}
showList( head );
sortList( &head, cmpScore );
showList( head );
}