用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->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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值