双向链表的排序

双向链表的排序
用单个指针单一方向进行排序,利用选择法排序的方法进行排序,对于链表排序的关键在于要和数组的排序方法一一对应,由于链表并不知道有多少个节点,也即不知道要进行多少次循环,所以对于数组中的惯用for循环就不适用了,链表中需要用到的是while循环,而对于双向链表而言循环条件大都是(p!=head)这个条件,然而在指针变量刚进入链表的头结点就是p=head,这样会造成while循环条件无法进入。
解决办法:现将while里的内容执行,将指针指向下一个节点后再进行while中的条件判断,用do while正好可以将问题解决。
代码如下:
void sort_link(DATA *head) // 排序
{
DATA *p_i=head,*p_j=head,*p_min=head;
DATA tmp;
if(head==NULL)
{
printf(“link not found\n”);
return;
}
while(p_i->next!=head)
{
p_min=p_i;
p_j=p_min->next;
while(p_j!=head)
{
if(p_min->num > p_j->num)
p_min=p_j; //记录min的位置

		p_j=p_j->next;
	}
	if(p_min != p_i)
	{
		//整体交换
		tmp=*p_i;
		*p_i=*p_min;
		*p_min=tmp;

		//指针域二次交换

		tmp.next=p_i->next;
		tmp.pre=p_i->pre;
		p_i->next=p_min->next;
		p_i->pre=p_min->pre;
		p_min->next=tmp.next;
		p_min->pre=tmp.pre;
	}


	p_i=p_i->next;
}
return;

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值