链表数据的自动排序

链表的自动排序

链表的自动排序:
           这是一种非常人性化的排序,是一种生活中人们经常使用的排序方法。思想很简单,但是代码还是有些难读懂,毕竟涉及到的指针有点多。
具体实现过程
           把头指针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);//释放空间函数 
}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值