首页 > 代码库 > 链表排序

链表排序

链表是一种在物理存储上非连续,非顺序的存储结构,数据的逻辑关系是通过指针链接次序实现的,链表通过一系列结点组成,结点可以在运行时动态生成。每个结点由两部分组成:数据域和存储下一结点的指针域。链表是一种常见的数据结构。

要想进行链表排序,首先得建立一个单链表,程序代码是由一个数组转化而来,代码如下:

先建立一个结点的结构体:

struct node
{
	int val;
	node *next;
};
node* _initial_node() //生成一个空的链表
{
	node *head=new node;
	head->val=0;
	head->next=NULL;
	return head;
}
node* _create(int *A,int length)  //将一个线性数组转化为一个单链表
{
	node *p1,*p2,*head;
	head=new node;
	head->val=A[0];

	p1=new node;
	head->next=p1;


	for(int i=1;i<length;i++)
	{
		if(i==length-1)
			p2=NULL;
		else
			p2=new node;
		p1->val=A[i];
		p1->next=p2;
		p1=p2;
		
	}
	return head;	
}
链表排序可以适用于插入排序方法和冒泡排序方法:本文用插入排序来做演示:

设计的思路:将要排序的链表中的数组的数值一一插入到一个新的空的链表中实现排序,插入的要求,检查数组和链表中的数值的大小,若比链表中的某个数值大,则将这个数值插入到这个结点的前面,若此链表中的所有的数都比这个数值大,则将这个数值插入到这个链表的最后的位置,插入数值的代码如下:

void _add_node(node *A,int x)
{
	node *temp=A,*Base,*temp1;

	Base=new node;
	Base->val=x;
	
	if(temp->val<x)
		Base->next=temp;
	else
	{
		temp=A->next;
		temp1=A;
		while(temp)
		{
			if(temp->val<x)
			{
				Base->next=temp;
				temp1->next=Base;
				break;
			}
			temp1=temp;
			temp=temp->next;
		}
		if(temp==NULL)
		{
			temp1->next=Base;
			Base->next=NULL;
		}
	}
}
下面就是链表插入排序的实现代码:

void main()
{
	int ia[]={9,2,0,3,1,8,3};
	node *he=_create(ia,7);
	node *A=_initial_node();
	int num=he->val;
	A->val=num;
	for(he=he->next;he!=NULL;he=he->next)
	{
		num=he->val;
		_add_node(A,num);
	}
	_show(A);
}
其中_show()函数是显示链表内容的函数,代码如下:

void _show(node *A)
{
	for(;A!=NULL;A=A->next)
	{
		cout<<A->val<<" ";
	}
	cout<<endl;
}
测试结果如下:






链表排序