链表的自动排序
链表的自动排序:
这是一种非常人性化的排序,是一种生活中人们经常使用的排序方法。思想很简单,但是代码还是有些难读懂,毕竟涉及到的指针有点多。
具体实现过程:
把头指针head所指的单链表置空(即初始化时head所指的单链表仅含有一个头结点),把去掉头结点的原单链表(设由头指针p指示)中的数据元素逐个重新插入head所指的单链表中。每次插入从head所指单链表的第一个数据元素结点开始,逐个比较head所指单链表每个结点的data域值和p所指单链表的当前第一个结点data域值,当前者小于右者时,用head所指单链表的下一个结点进行比较;否则,就找到了插入结点的合适位置,从p所指单链表中取下当前第一个数据元素结点插入到head所指单链表的合适位置。这样的过程一直进行到p所指单链表为空时结束。
代码:
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
#include"LinList.h" // 自己写的单链表的头文件。
void LinAutoSort(SLNode *head)//链表自动排序算法
{
SLNode *curr ,*pre ,*p ,*q;
p=head->next;//链表的首元素的地址储存起来
head->next=NULL;//链表置空
while(p!=NULL)
{
curr=head->next;
pre=head;
while(curr!=NULL&&curr->data<=p->data)
{
pre=curr;
curr=curr->next;
}
q=p;
p=p->next;
q->next=pre->next;
pre->next=q;
}
}
int main(void)
{
SLNode *head;
int i,a,x;
ListInitiate(&head);//链表得初始化,开辟空间
for(i=0;i<5;i++)
{
scanf("%d",&a);
if(ListInsert(head,i,a)==0)//ListInsert()为链表得插入函数,插入错误时返回值为0。
{
printf("插入错误!\n");
return 0 ;
}
}
LinAutoSort(head);//排序
for (i=0;i<5;i++)
{
ListGet(head,i,&x);//链表的取值函数
printf("%d ",x);
}
ListDestroy(&head);//释放空间函数
}