链表的一个特点,就是当你拥有一个结点的链接时就拥有一个链表。
这里的例子使用哑元头结点,实现一个单链表元素的升序排列。
排序时使用两个链表,一个是原始的含有要排序元素的,一个是新的用来存入排序结果的。
排序时,原来链表顺序扫描直到结束;每扫到一个就到新链表中去顺序扫描直到找到一个比它大的元素或扫描完,然后把这个原链表中的结点挂到新链表中去。
vc++ 8.0 console application
#include <iostream>
#include <cassert>
#include <cstdlib> // for function srand and rand
#include <ctime> // for function time(...)
using namespace std;
struct Node
{
int item;
Node* next;
Node( int item_info, Node* pLink ) : item(item_info), next(pLink)
{
}
};
typedef Node* Link;
// 创建链表,使用哑元头结点,返回它的链接
Link CreateList( int nodeCount )
{
Link pHead = new Node( -1, 0 ); // 哑元结点
Link pLinkTemp = pHead;
srand( time( NULL ) );
for ( int nPos = 0; nPos < nodeCount; nPos ++ )
{
int itemTmp = rand( ) % (nodeCount+100);
pLinkTemp = ( pLinkTemp->next = new Node(itemTmp, 0) );
}
return pHead;
}
// 销毁
void DestroyList( Link pFirst )
{
for ( ; pFirst != NULL; )
{
Link nextLink = pFirst->next;
delete pFirst;
pFirst = nextLink;
}
}
// 链表大小
int GetLinkSize( Link pFirst )
{
int nRet = 0;
while ( pFirst != NULL )
{
nRet ++;
pFirst = pFirst->next;
}
return nRet;
}
// 按元素升序排序
Link Sort( Link pFirst )
{
if ( pFirst == NULL )
return pFirst;
Link pOrgHead = pFirst;
Link pNewHead = new Node( -2, 0 );
for ( Link pOrgLink = pOrgHead->next; pOrgLink != NULL; )
{
Link pTempOrgLink = pOrgLink->next;
Link pNewLink = pNewHead;
for ( ; pNewLink->next != NULL; pNewLink = pNewLink->next )
{
if ( pNewLink->next->item > pOrgLink->item )
break;
}
// 新链表增加一个结点, 旧链表减少一个结点
pOrgHead->next = pOrgLink->next;
pOrgLink->next = pNewLink->next;
pNewLink->next = pOrgLink;
pOrgLink = pTempOrgLink; // 取原链表的下一个结点
}
return pNewHead;
}
// output info of every node
void OutputInfo( Link pFirstNode )
{
if ( pFirstNode == NULL )
return;
Link pTempLink = pFirstNode;
while ( pTempLink != NULL )
{
cout << pTempLink->item << endl;
pTempLink = pTempLink->next;
}
}
/// test code
int _tmain(int argc, _TCHAR* argv[])
{
// create
Link pFirst = CreateList( 10 );
// output info
cout << "before sorted, original link content: " << endl;
OutputInfo( pFirst );
// sort
Link pNewLinkFirst = Sort( pFirst );
// output info
cout << "/n*************" << endl;
cout << "after sorted, original link content: " << endl;
OutputInfo( pFirst );
cout << "after sorted, new link content: " << endl;
Link pNewTmpLink = pNewLinkFirst;
if ( pNewTmpLink == NULL )
cout << "no node" << endl;
else
OutputInfo( pNewLinkFirst );
cout << "original link size: " << GetLinkSize( pFirst ) << endl;
cout << "new link size: " << GetLinkSize( pNewLinkFirst ) << endl;
// destroy
DestroyList( pFirst );
DestroyList( pNewLinkFirst );
//cout << "size: " << GetLinkSize( pFirst ) << endl;
return 0;
}