sort list by swap point
2009-04-28 12:59:26 發表
#include
#include
#include
struct Node
{
int m_nData;
Node *m_pNext;
Node(int a_nData=0) : m_pNext(NULL),m_nData(a_nData) {}
};
class List
{
public :
List() : m_pHead(NULL),m_pTail(NULL),m_nSize(0) {}
~List();
bool add(int a_nData); // add one data
void sort(); // sort me
void clean(); // clean all data
void display(std::ostream& a_oOut=std::cout) const; // display me
bool empty(); // is empty
size_t size() const // how many data in list
{ return m_nSize; }
private:
Node *m_pHead; // 頭
Node *m_pTail; // 尾
unsigned m_nSize;
// 交換 a_pPrvNext 指向的node 跟此node 的下一個node
void NodeSwap(Node*& a_pPrvNext);
};
List::~List()
{
clean();
}
bool List::empty()
{
if( m_pHead == NULL ) return true;
else return false;
}
void List::clean()
{
Node *pCurrent=m_pHead;
while( pCurrent!= NULL )
{
Node *pTemp=pCurrent;
pCurrent=pCurrent->m_pNext;
delete pTemp;
}
m_pHead=m_pTail=NULL;
m_nSize=0;
}
bool List::add(int a_nData)
{
if( m_pHead == NULL )
{
m_pHead=new Node(a_nData);
m_pTail=m_pHead;
}
else
{
Node *pTemp=new Node(a_nData);
m_pTail->m_pNext=pTemp;
m_pTail=pTemp;
}
++m_nSize;
return true;
}
void List::sort()
{
unsigned i;
if( empty() ) return;
for( i = 0 ; i < m_nSize-1 ; ++i )
{
unsigned j;
Node **p=&m_pHead;
for( j = 0 ; j < m_nSize-i-1 ; ++j )
{
if( (*p)->m_nData > (*p)->m_pNext->m_nData ) // 跟下一個data 比較. 如下一個比較小, 交換
{
NodeSwap(*p);
}
p=&((*p)->m_pNext);
}
}
}
// 把a_pC 跟a_pPrv 交換, node a_pPrv 必須是a_pC 的前一個
void List::NodeSwap(Node*& a_pPrvNext)
{
Node* pC=a_pPrvNext;
if( pC == m_pTail )
{
return ; // 不能交換
}
a_pPrvNext=pC->m_pNext;
Node *pNextNext=pC->m_pNext->m_pNext;
if( pC->m_pNext == m_pTail )
{
m_pTail=pC;
}
pC->m_pNext->m_pNext=pC;
pC->m_pNext=pNextNext;
}
void List::display(std::ostream& a_oOut) const
{
if( m_pHead == NULL )
{
a_oOut << "Empty " << std::endl;
}
else
{
a_oOut << "Total : "<< m_nSize << std::endl;
Node *pCurrent=m_pHead;
while( pCurrent )
{
a_oOut << pCurrent->m_nData << std::endl;
pCurrent=pCurrent->m_pNext;
}
}
}
int main(int argc, _TCHAR* argv[])
{
List a;
a.add(5);
a.add(4);
a.add(3);
a.add(2);
a.add(1);
a.display();
a.sort();
a.display();
return 0;
}
#include
#include
struct Node
{
int m_nData;
Node *m_pNext;
Node(int a_nData=0) : m_pNext(NULL),m_nData(a_nData) {}
};
class List
{
public :
List() : m_pHead(NULL),m_pTail(NULL),m_nSize(0) {}
~List();
bool add(int a_nData); // add one data
void sort(); // sort me
void clean(); // clean all data
void display(std::ostream& a_oOut=std::cout) const; // display me
bool empty(); // is empty
size_t size() const // how many data in list
{ return m_nSize; }
private:
Node *m_pHead; // 頭
Node *m_pTail; // 尾
unsigned m_nSize;
// 交換 a_pPrvNext 指向的node 跟此node 的下一個node
void NodeSwap(Node*& a_pPrvNext);
};
List::~List()
{
clean();
}
bool List::empty()
{
if( m_pHead == NULL ) return true;
else return false;
}
void List::clean()
{
Node *pCurrent=m_pHead;
while( pCurrent!= NULL )
{
Node *pTemp=pCurrent;
pCurrent=pCurrent->m_pNext;
delete pTemp;
}
m_pHead=m_pTail=NULL;
m_nSize=0;
}
bool List::add(int a_nData)
{
if( m_pHead == NULL )
{
m_pHead=new Node(a_nData);
m_pTail=m_pHead;
}
else
{
Node *pTemp=new Node(a_nData);
m_pTail->m_pNext=pTemp;
m_pTail=pTemp;
}
++m_nSize;
return true;
}
void List::sort()
{
unsigned i;
if( empty() ) return;
for( i = 0 ; i < m_nSize-1 ; ++i )
{
unsigned j;
Node **p=&m_pHead;
for( j = 0 ; j < m_nSize-i-1 ; ++j )
{
if( (*p)->m_nData > (*p)->m_pNext->m_nData ) // 跟下一個data 比較. 如下一個比較小, 交換
{
NodeSwap(*p);
}
p=&((*p)->m_pNext);
}
}
}
// 把a_pC 跟a_pPrv 交換, node a_pPrv 必須是a_pC 的前一個
void List::NodeSwap(Node*& a_pPrvNext)
{
Node* pC=a_pPrvNext;
if( pC == m_pTail )
{
return ; // 不能交換
}
a_pPrvNext=pC->m_pNext;
Node *pNextNext=pC->m_pNext->m_pNext;
if( pC->m_pNext == m_pTail )
{
m_pTail=pC;
}
pC->m_pNext->m_pNext=pC;
pC->m_pNext=pNextNext;
}
void List::display(std::ostream& a_oOut) const
{
if( m_pHead == NULL )
{
a_oOut << "Empty " << std::endl;
}
else
{
a_oOut << "Total : "<< m_nSize << std::endl;
Node *pCurrent=m_pHead;
while( pCurrent )
{
a_oOut << pCurrent->m_nData << std::endl;
pCurrent=pCurrent->m_pNext;
}
}
}
int main(int argc, _TCHAR* argv[])
{
List a;
a.add(5);
a.add(4);
a.add(3);
a.add(2);
a.add(1);
a.display();
a.sort();
a.display();
return 0;
}



