单链表排序

链表的一个特点,就是当你拥有一个结点的链接时就拥有一个链表。

这里的例子使用哑元头结点,实现一个单链表元素的升序排列。
排序时使用两个链表,一个是原始的含有要排序元素的,一个是新的用来存入排序结果的。
排序时,原来链表顺序扫描直到结束;每扫到一个就到新链表中去顺序扫描直到找到一个比它大的元素或扫描完,然后把这个原链表中的结点挂到新链表中去。


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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值