当前位置:
文档之家› C++链表类的实现(面向对象的思想)
C++链表类的实现(面向对象的思想)
cout<<"请按任意键继续..."<<endl; _getch();
//节点的指针复位 pNode = g_World.getObjectLink().m_pHead;
//遍历链表(删除节点) while(pNode != NULL)
{ if(pNode->m_pObject->IsDead()) { //删除节点 g_World.getObjectLink().DeleteNode(pNode->m_pObject); cout<<"删除节点成功"<<endl; count --; break; } pNode = pNode->pNext;
2:删除节点
//
3:插入节点
//程序说明:Class Object,World,LinkObject
//
Object:是节点的数据域的数据
//
World: 用于返回链表对象
//
LinkObject:链表类,提供了对链表操作的基本方法
//代码行数:300
//作者:CreateDBW 时间:2012 年 12 月 10 日
count ++; if(count == flag) {
//为新增的节点分配内存 Node *pInsertNode = new Node(pObj); //新增节点的后一个节点的地址(pNode->pNext) //存储在新增节点(pInsertNode)的 pNext 中. pInsertNode->pNext = pNode->pNext; //把新增节点的地址 pInsertNode 存储到 pNode->pNext //中 pNode->pNext = pInsertNode; return ; } pNode = pNode->pNext; } //如果要插入的节点是在最后就用下面的函数 AddNode(pObj); } LinkObject::~LinkObject() {
如果满足条件(找到了要删除的节点): */ if(pNode->m_pObject == obj) {
/* pNode 指针指向的节点是要删除的节点,则: pNode->pNext 保存的是要删除节点的下一个 节点的首地址,把他的地址给 pPreNode->pNext 就是说:pNode 指针指向的节点这时已经不在链 表中了.因为,pPreNode 是要删除的节点的前一 个节点
cout<<"请按任意键继续..."<<endl; _getch();
//在第三个节点的后边插入节点 g_World.getObjectLink().InsertNode(new Object(100),3); count ++; cout<<"插入节点后的节点个数:"<<count<<endl; //节点的指针复位 pNode = g_World.getObjectLink().m_pHead;
LinkObject lObj; unsigned int count = 0; int data = 0; //创建五个节点的链表用于测试 for(int i=0;i<5;i++) {
g_pObj = new Object(i); if(i == 2) {
g_pObj->Dead(); } g_World.getObjectLink().AddNode(g_pObj); count ++; } //把创建的链表的首地址赋值给 pNode //这时的 pNode 和 m_pHead 指向同一块内存区域 Node *pNode = g_World.getObjectLink().m_pHead; cout<<"显示链表数据"<<endl; //遍历链表(测试链表是否创建成功) while(pNode != NULL) { data = pNode->m_pObject->getData(); cout<<" Data:"<<data<<endl; pNode=pNode->pNext; }
}
World::~World()
{
} ////////////////////// //Main:对链表测试 ////////////////////// World g_World;//全局变量,返回链表的对象 Object *g_pObj = NULL;//全局变量,节点的数据 int main() {
Object::~Object() {
} ////////////////////// //Class:LinkObject ////////////////////// struct Node {
Object *m_pObject; struct Node *pNext; public: Node(){} //构造函数,当节点被创建时给节点的数据初始化 Node(Object *obj) {
////////////////////////////////////////////////////////////////////////
#include "iostream"
#include "conio.h"
using namespace std;
////////////////////// //Class:Object ////////////////////// class Object { public:
////////////////////////////////////////////////////////////////////////
//测试环境:Microsoft Visual C++ 6.0
//程序功能:C++单链表的实现(节点的数据是对象)
//
1:创建链表(在链表尾部填加链表)
//
} ////////////////////// //Class:World ////////////////////// class World { public:
World(); //返回链表的对象 LinkObject &getObjectLink() {
return m_Object; } virtual ~World(); private: LinkObject m_Object; }; World::World() {
//便利链表(测试节点是否插入成功) while(pNode != NULL) {
data = pNode->m_pObject->getData(); cout<<" Data:"<<data<<endl; pNode=pNode->pNext; }
return 0; }
*/ pPreNode->pNext = pNode->pNext; delete pNode; return ; } pPreNode = pNode; //得到下一个节点的地址 pNode = pNode->pNext; } } void LinkObject::InsertNode(Object *pObj,int flag) { Node *pNode = m_pHead; int count = 0;//统计节点的个数 while(pNode != NULL) {
m_pObject = obj; } //析构函数,当节点被删除时调用 ~Node() {
delete m_pObject; } }; ////////////////////////////////////// class LinkObject { public: LinkObject(); void AddNode(Object *pObj);//在链表尾添加节点 void DeleteNode(Object *pObj);//删除节点 void InsertNode(Object *pObj,int flag);//在第 flag 的位置后边插入节点 virtual ~LinkObject();
return data; } virtual ~Object(); protected:
bool m_bIsDead;//对象死亡标志,测试链表时用 private:
int data; };
Object::Object(int Data) {
data = Data; m_bIsDead = false; }
Object(){} Object(int Data); void setData(int Data) {
data = Data; } void Dead() {
m_bIsDead = true; } bool IsDead() {
return m_bIsDead; } int getData() {
/* 把链表的头指针 m_pHead(地址)赋值给 pPreNode 这时,m_pHead 和 pPreNode 的地址相同,即:m_pHead 和 pPreNode 指向内存的同一块区域
*/ Node *pPreNode =ห้องสมุดไป่ตู้m_pHead; /*
判断头指针的数据(这里的数据是类)是不是要删除 因为 pNext 中放的是下一个节点的地址,所以,要把下 一个节点的地址赋给 m_pHead 这时候,pNext 指向的节 点就与 m_pHead 链接上了.然后就删除 pPreNode 指 向的内存,来释放内存空间.当然,这个时候你可以不 用 delete 来释放内存,因为这个时候 obj 所在的节点已