要排序的是链表,记得上次排序结构体的时候本身创建的就是结构体数组所以空间连续可排。
但是链表是离散的,不能直接Qsort。
所以分配一个临时空间用来存储地址,然后排序地址再重新建立。
之所以记录在这里是因为其中写cmp函数的时候,发现形参怎么写还是有些讲究的,于是放在这里以方便查看!
//--------------------------------struct部分
typedef struct LinkedlistNode //链表节点
{
int data;
LinkedlistNode* next;
}node;
struct LinkInfo //用来记录链表头结点、最后一个节点、元素个数
{
int listlen;
LinkedlistNode *head,*tail;
};
//--------------------------Qsort部分
cmpIncrease(const void *left,const void *right)
//node **p=(node **)left;
node *p=*(node **)left;//cmp函数两种访问方式
node **q=(node **)right;
if(p->data>(*q)->data)
return 1;
else
return p->data==(*q)->data?0:-1;
}
int cmpDecrease(const void *left,const void *right)
{
//node **p=(node **)left;
node *p=*(node **)left;//cmp函数两种访问方式
node **q=(node **)right;
if(p->data<(*q)->data)
return 1;
else
return p->data==(*q)->data?0:-1;
}
void LinkSortQ(LinkInfo *L,bool increase)
{
if(L->listlen<=1)
return;
node* (*all)=new node* [L->listlen];
all[0]=L->head->next;
for(int i=1;i<L->listlen;i++)
all[i]=(all[i-1])->next;
qsort((node *)(all),L->listlen,sizeof(node *),increase?cmpIncrease:cmpDecrease);
node *start=L->head;
for(int i=0;i<L->listlen;i++)
{
start->next=all[i];
start=start->next;
}
L->tail=all[L->listlen-1];
delete(all);
}