头文件:
#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;
}