双向链表的排序
用单个指针单一方向进行排序,利用选择法排序的方法进行排序,对于链表排序的关键在于要和数组的排序方法一一对应,由于链表并不知道有多少个节点,也即不知道要进行多少次循环,所以对于数组中的惯用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;
}