用單鏈表對直接插入排序的簡單實現

頭文件:

#ifndef _MAIN_H_
#define _MAIN_H_

typedef struct tagNode
{
    int iData;
    tagNode* pNext;
    tagNode():iData(0),pNext(NULL){};
}NODE,*PNODE;

class LST
{
public:
    LST();
    ~LST();
    PNODE CreatNode(int iData); 
    void  InsertNode(PNODE pNewNode);
    void  PrintNode();
protected:

private:
    PNODE pHead;//鏈表頭結點爲空結點,不保存實際數據內容,但是在析構函數中必須釋放這個結點。
};

#endif

cpp文件:

#include <IOSTREAM>
#include "main.h"

using namespace std;

/**************************************************/
/* CLASS function defintion                                             */
/**************************************************/
PNODE LST::CreatNode(int iData)
{
    PNODE pNewNode = NULL;
    pNewNode = new NODE;
    if (NULL == pNewNode)
    {
        return NULL;
    }
    pNewNode->iData = iData;
    return (pNewNode);
}

void LST::InsertNode(PNODE pNewNode)
{
    PNODE pCurNode = NULL;
    PNODE pTmpNode = NULL;

    if (NULL == pNewNode)   return ;
    if (NULL == pHead)
    {
        pHead = new NODE;
    }
    if (pHead->pNext == NULL)   
    {
        pHead->pNext = pNewNode;
        return ;
    }

    pCurNode = pHead->pNext;

    while(NULL != pCurNode)
    {       
        if (pNewNode->iData < pCurNode->iData)
        {
            /*分兩種情況考慮:
            1.如果pCurNode爲頭結點之後的第一個結點
              則直接插入pNewNode到頭結點之後,並與原鏈表合併
            2.如果不是上述情況,則將pNewNode插入到pTmpNode和
              pCurNode之間
            */
            pNewNode->pNext = pCurNode;
            if (pTmpNode == NULL)
            {
                pHead->pNext = pNewNode;
            }
            else
            {
                pTmpNode->pNext = pNewNode;
            }

            return;
        }

        pTmpNode = pCurNode;    //
        pCurNode = pCurNode->pNext;
    }

    //如果程序運行到這裏,表示pNewNode比原鏈表中所有結點均大
    //則直接插入到鏈表後即可
    pTmpNode->pNext = pNewNode;

}

void LST::PrintNode()
{
    PNODE pTmpNode = NULL;
    pTmpNode = pHead->pNext;
    while(pTmpNode != NULL)
    {
        cout<<pTmpNode->iData<<",";
        pTmpNode = pTmpNode->pNext;
    }
    cout<<endl;
}

void LST::DelNode()
{

}

LST::LST()
{
    pHead = NULL;
}

LST::~LST()
{

}

/**************************************/
/* Main function                                                        */
/**************************************/
int main()
{
    int     iIn;
    PNODE   pNode = NULL;
    LST     lst;
    //while((cIn = getchar() != '\n'))
    while(cin>>iIn)
    {
        if (iIn == -1)
        {//退出條件判斷
            break;
        }
        //pNode = lst.CreatNode((int)atoi(&cIn));
        pNode = lst.CreatNode(iIn);
        if (NULL != pNode)
        {
            lst.InsertNode(pNode);
        }
    }

    lst.PrintNode();
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章