链表排序

链表排序

//首先写一下两种插入法

 

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;//扫描余下结点
  }
 }
}

下面这幅图找了很久,如果还不明白,自己跟着程序画一下图,就很容易明白了

posted on 2012-10-23 11:06  即为将军  阅读(578)  评论(0)    收藏  举报

导航