链表排序
链表排序
//首先写一下两种插入法
void CreateListF(LinkList *&L,ElemType a[],int n)
{
LinkList *s;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=a[i];
s->next=L->next;
L->next=s;
}
}

尾插法
void CreateListF(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));//创建头结点
r=L;//r始终指向尾结点
for(i=0;i<n;i++)
{
s=(LinkList *)malloc(sizeof(LinkList));//创建新结点
s->data=a[i];
r->next=s;//将*s插在*r后
r=s;
}
r->next=NULL;//将尾结点next域置空
}
链表直接插入法排序
void sort(LinkList *&L)
{
LinkList *p=L->next,*q,*r;//p指向第1个数据结点
if(p!=NULL)//保证原链表不为空
{
r=p->next;//r保存*p结点后继结点的指针
p->next=NULL;//构造只含一个结点的有序表
p=r;
while(p!=NULL)
{
r=p->next;
q=L;
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
p->next=q->next;//将*p插入到*q之后
q->next=p;
p=r;//扫描余下结点
}
}
}
下面这幅图找了很久,如果还不明白,自己跟着程序画一下图,就很容易明白了

浙公网安备 33010602011771号