用单链表对直接插入排序的简单实现

头文件:

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值