单链表的排序
单链表的排序,其实思想还是和以前c语言的数组的排序一样,只是这里运用了指针,for循环里的不再是(i=0;i<n;i++)了,而是(p=L->next;p->next!=NULL;p=p->next),变的地方只是循环的判断条件不一样,但是思想还是一样的
代码(升序)
#include <iostream>
#include <malloc.h>
using namespace std;
typedef int ElemType;
typedef struct LNode
{
ElemType data;
struct LNode *next;
}LinkNode;
void InitList(LinkNode *&L)//单链表初始化
{
L=(LinkNode*)malloc(sizeof(LinkNode));
L->next=NULL;
}
void CerateList(LinkNode*&L,ElemType a[],int n)//尾插法创建链表
{
LinkNode *s,*r;
r=L;
for(int i=0;i<n;i++)//创建链表的循环输入
{ cin>>a[i];//输入链表的元素
s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=a[i];
s->next=r->next;
r->next=s;
r=s;
}
r->next=NULL;//链表末尾指向空
}
void DispList(LinkNode *L,char X)//输出链表
{
cout<<X<<"的单链表为:";
LinkNode *p=L->next;
while(p!=NULL)//循环输出链表
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
void def(LinkNode*&L,char X)//创建数组并调用创建数组
{
int a[100],n;
cout<<"请输入单链表"<<X<<"长度:";
cin>>n;
cout<<"请输入单链表"<<X<<"的元素:";
CerateList(L,a,n);
}
void Link_sort(LinkNode *&L)//升序
{
LinkNode *q;
LinkNode *p=NULL;
ElemType x;
for(q=L->next;q->next!=NULL;q=q->next)
{
for(p=q->next;p!=NULL;p=p->next)
{
if(q->data>=p->data)
{
x=q->data;
q->data=p->data;
p->data=x;
}
}
}
}
int main()
{
LinkNode *A;//定义结构体指针
InitList(A);//初始化链表
def(A,'A');//创建数组并调用创建链表函数
DispList(A,'A');//输出链表
Link_sort(A);//核心:链表升序
DispList(A,'A');//输出升序之后的链表
return 0;
}
核心代码
void Link_sort(LinkNode *&L)//升序
{
LinkNode *q;
LinkNode *p=NULL;
ElemType x;
for(q=L->next;q->next!=NULL;q=q->next)
{
for(p=q->next;p!=NULL;p=p->next)
{
if(q->data>=p->data)
{
x=q->data;
q->data=p->data;
p->data=x;
}
}
}
}
想要降序排列只要把升序里的if判断条件if(q->data>=p->data)换成if(q->data<=p->data)就行了