一个双向链表排序问题:
题目:
建立一个长度为n的带头结点的双向链表,使得该链表中的数据元素递增有序排列。(必须使用双向链表完成,数据类型为整型。)
思路:
根据题目建立好该双向链表(尾插法),然后用个指针依次查找,先从第一个节点往后走,找出最大节点max,再将max和最后一个元素交换,第一遍结束(即奇数遍正向查找);第二遍,从最后一个节点开始倒着往前找,找到最小节点min,与第一个节点交换,第二遍结束(即偶数遍反向查找);第三遍,再从指针此刻的位置即第2个节点往后找,找到第二大节点,与倒数第二个节点交换;第四遍,倒着往前找,。。。。依次循环,做n-1次。
typedef int DataType;
typedef struct node
{
DataType data;
struct node *prior;//前域
struct node *next;//后继
}Node;//双向链表的创建
void Create(Node *&L,DataType a[],int n)
{
int i;
Node *s,*r;
L=(Node*)malloc(sizeof(Node));
r=L;
for(i=0;i<n;i++)
{
s=(Node*)malloc(sizeof(Node));
s->data=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
}//尾插法创建双链表
void Sort(Node *&L,int n)//排序
{
int i,j,temp;
int count=n;
Node *p=L;
Node *min,*max;
p=p->next;
for(i=1;i<count;i++)
{
if(i%2!=0)//第奇数遍反向
{
min=p;
for(j=0;j<n-1;j++)
{
p=p->next;
if(p->data<min->data)
{
temp=min->data;
min->data=p->data;
p->data=temp;
}
}
n--;
}
else//第偶数遍正向
{
max=p;
for(j=1;j<n;j++)
{
p=p->prior;
if(p->data>max->data)
{
temp=max->data;
max->data=p->data;
p->data=temp;
}
}
n--;
}
}
}
//就是来回折返查找。