排序函数如下:
typedef struct Node
{
int data;
Node *next;
Node(int a);
}List;
Node::Node(int a)
{
data = a;
next = NULL;
}
void sortList(List *&L)
{
if(L == NULL)
{
return; //空链表
}
//如 1 2 3 6 | 4 2 6 7
// pL 有序区 pR 无序区
Node *pL = NULL; //有序区最左边结点
Node *pR = NULL; //有序区最右边结点
Node *cur = NULL; //while循环当前结点
Node *cur2 = NULL; //for循环当前结点
Node *pre2 = NULL; //for循环上一个结点
Node *tmp; //辅助结点,保存被取出的结点
cur = L->next; //从链表第二个结点开始
pL =pR = L; //开始时,有序区为左右边界都为第一个结点
while(cur!= NULL) //如果只有一个结点
{
if(cur->data < pR->data)
{
tmp = cur; //保存当前结点
pR->next = cur->next; //把当前结点移除
if(pL->data > tmp->data) // 第一种情况 当前结点 小于 有序区第一个结点
{ //
tmp->next = pL; //把当前结点,插入到链表头部
pL = tmp; //pL 作为链表头部
}
else //第二种情况 当前结点小于 除了第一的结点外的其他结点
{
for(cur2 = pL->next,pre2 = pL;(cur2 != pR->next)&&(cur2 != NULL);cur2 = cur2->next,pre2 = pre2->next)
{
if(cur2->data > tmp->data)
{
pre2->next = tmp;
tmp->next = cur2;
break;
}
}
}
} //第三种情况,当前结点大于有序区所有结点
else
{
pR = pR->next; //有序区右边界 右移
}
cur = pR->next; //当前结点 指向 有序区右边界的下一个结点
}
L = pL; //返回排序好的链表头结点
}
#include <iostream>
using namespace std;
typedef struct Node
{
int data;
Node *next;
Node(int a);
}List;
Node::Node(int a)
{
data = a;
next = NULL;
}
void CreateList(List *&L)
{
int data = 0;
Node *pre = NULL;
L = NULL;
while((cin>>data)&&(data != -1))
{
Node *node = new Node(data);
if(node == NULL)
return;
if(L == NULL)
{
pre = node;
L = pre;
}
else
{
pre->next = node;
pre = pre->next;
}
}
pre->next = NULL;
}
void DisplayList(List *L)
{
if(L == NULL)
return;
while(L != NULL)
{
cout<<L->data<<endl;
L = L->next;
}
}
void sortList(List *&L)
{
if(L == NULL)
{
return; //空链表
}
//如 1 2 3 6 | 4 2 6 7
// pL 有序区 pR 无序区
Node *pL = NULL; //有序区最左边结点
Node *pR = NULL; //有序区最右边结点
Node *cur = NULL; //while循环当前结点
Node *cur2 = NULL; //for循环当前结点
Node *pre2 = NULL; //for循环上一个结点
Node *tmp; //辅助结点,保存被取出的结点
cur = L->next; //从链表第二个结点开始
pL =pR = L; //开始时,有序区为左右边界都为第一个结点
while(cur!= NULL) //如果只有一个结点
{
if(cur->data < pR->data)
{
tmp = cur; //保存当前结点
pR->next = cur->next; //把当前结点移除
if(pL->data > tmp->data) // 第一种情况 当前结点 小于 有序区第一个结点
{ //
tmp->next = pL; //把当前结点,插入到链表头部
pL = tmp; //pL 作为链表头部
}
else //第二种情况 当前结点小于 除了第一的结点外的其他结点
{
for(cur2 = pL->next,pre2 = pL;(cur2 != pR->next)&&(cur2 != NULL);cur2 = cur2->next,pre2 = pre2->next)
{
if(cur2->data > tmp->data)
{
pre2->next = tmp;
tmp->next = cur2;
break;
}
}
}
} //第三种情况,当前结点大于有序区所有结点
else
{
pR = pR->next; //有序区右边界 右移
}
cur = pR->next; //当前结点 指向 有序区右边界的下一个结点
}
L = pL; //返回排序好的链表头结点
}
void ClearList(List *&L)
{
Node *tmp = NULL;
while(L != NULL)
{
tmp = L->next;
free(L);
L = tmp;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
List *L = NULL;
CreateList(L);
DisplayList(L);
sortList(L);
DisplayList(L);
ClearList(L);
DisplayList(L);
}