用Qsort排序链表的使用实例记录

用Qsort排序链表的使用实例记录

排序的是链表,记得上次排序结构体的时候本身创建的就是结构体数组所以空间连续可排。

但是链表是离散的,不能直接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->datadata)
		return 1;
	else
		return p->data==(*q)->data?0:-1;
}
void LinkSortQ(LinkInfo *L,bool increase)
{
	if(L->listlenlistlen];
	all[0]=L->head->next;
	for(int i=1;ilistlen;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;ilistlen;i++)
	{
		start->next=all[i];
		start=start->next;
	}
	L->tail=all[L->listlen-1];
	delete(all);
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注