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


這篇文章讓你覺得?

0 個回應 想要回應?請登入

瀏覽設定收摺

提醒

您即將連結到YAHOO!以外的網站,請確定是否繼續瀏覽?

若該網站要求登入或輸入個人資料,請多加留意!

知識+ 之問答內容是由參與Yahoo!奇摩知識+ 之網友提供,僅供參考,Yahoo!奇摩不保證其正確性。

推薦文章

( 請輸入純文字,切勿使用html語法 )剩餘字數:100
目前沒有資料

( 若要同時新增多個標籤,請用半形空格隔開 )

建議標籤:
標籤已經選取完畢

警告