急切需要帮助,关于Truck 和Package , 链表的问题,请你们帮忙,谢谢

wengchaohui 2008-05-03 09:43:08
我在树上看到一个例子,可是有个问题始终让我想不通,问题如下:
该例子是这样的:我们将Box建为一个类,将若干个box对象链接在一起,那么将他们收集到一起,作者的办法是定义package对象,,该对象有两个重要功能,可以包含 box 对象,还可以与另一个package对象链接起来,,每个package对象包含一个box对象,并构成package对象链,而truckload对象表示一货车的box(盒子),在货车上有任意个盒子,,package对象提供了truckload对象跟踪他包含对象的机制,及truckload 可以调用他的Box 对象,关系如图,
Truckload
|--------------------------------------------------------------------
package 对象:

{ Box theBox;
package* pnext;} ----->package对象:

{Box theBox;
package* pnext;} ---------〉package对象
{Box theBox;
package* pnext;}

//于是就有下面的程序 先定义Box类,

//Box.h
#ifndef BOX_H
#define BOX_H
class Box
{
public:
Box( double aLength=1.0,double aBreadth=1.0,double aHeight=1.0);
double volume() const;

double getLength() const ;
double getBreadth() const;
double getHeight() const;

int compareVolume(const Box& otherBox) const;

private:
double length;
double breadth;
double height;
};
#endif

以及box函数定义,
//Box.cpp
#include"Box.h"
Box::Box(double aLength,double aBreadth,double aHeight)
{length =aLength> 0.0 ? aLength:1.0;
breadth=aBreadth>0.0 ? aBreadth : 1.0;
height=aHeight > 0.0 ? aHeight : 1.0;
}
//calculate Box volume
double Box::volume() const{return length;}

double Box::getLength() const {return length;}
double Box::getBreadth() const {return breadth;}
double Box::getHeight() const {return height;}

int Box::compareVolume(const Box& otherBox) const
{
double vol1=volume();
double vol2=otherBox.volume();
return vol1>vol2? 1 :(vol1<vol2 ? -1:0);
}
稍微看一下即可 这个没关系 重要是下面的文件,
//List.h
#ifndef LIST_H
#define LIST_H
#include "Box.h"
class Package
{
public:
Package(Box* pNewBox);
Box* getBox() const; //得到箱子
Package* getNext() const; //下一个package
void setNext(Package* pPackage); //设置下一个package的地址
private:
Box* pBox;
Package* pNext;

};

class TruckLoad
{
public:
TruckLoad(Box* pBox=0,int count=1);
Box* getFirstBox(); //得到第一个箱子
Box* getNextBox();
void addBox(Box*pBox);//得到下一个箱子
private:
Package* pHead; //第一个package
Package* pTail; //最后一个package
Package *pCurrent; //当前package
};

#endif

//LIst.cpp 关于package 和truckload里函数的定义
#include"Box.h"
#include"List.h"
Package::Package(Box* pNewBox):pBox(pNewBox),pNext(0){} //将箱子给package,下一个package地址指为0

Box* Package::getBox() const {return pBox;} //让package返回(得到)箱子
Package* Package::getNext() const{return pNext;} //下一个package
void Package::setNext(Package* pPackage) {pNext=pPackage;} //设置下一个package


TruckLoad::TruckLoad(Box* pBox,int count)
{
pHead=pTail=pCurrent=0; //想让truckload的几个成员为空指针
if((count>0)&&(pBox !=0))
for(int i=0;i<count;i++)
addBox(pBox+i); // 产生若干个箱子
}
Box*TruckLoad::getFirstBox() //一开始将第一个package 给当前package
{
pCurrent = pHead;
return pCurrent->getBox(); //让当前package取箱子就第一个箱子
}
Box*TruckLoad::getNextBox()
{
if(pCurrent)
pCurrent=pCurrent->getNext(); //让当前package指向下一个package (我的问题所在)
else
pCurrent=pHead; //再让当前package取箱子及下一个箱子
return pCurrent ? pCurrent->getBox() :0;
}
void TruckLoad::addBox(Box* pBox)
{
Package* pPackage=new Package(pBox); //产生一个箱子(Box)就产生一个package
if(pHead)
pTail->setNext(pPackage); //如果第一个箱子存在,将新产生的箱子放到最后
else
pHead=pPackage;
pTail=pPackage;
}

//zong.cpp
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
#include"Box.h"
#include"List.h"
inline int random(int count)
{
return 1+static_cast<int>((count*static_cast<long>(rand()))/(RAND_MAX+1));
}
int main()
{const int dimLimit=100;
srand((unsigned)time(0));
TruckLoad load1;
for(int i=0;i<10;i++)
load1.addBox(new Box(random(dimLimit),random(dimLimit),random(dimLimit)));
Box* pBox=load1.getFirstBox();
Box* pNextBox;
while(pNextBox=load1.getNextBox())
if(pBox->compareVolume(*pNextBox)<0)
pBox=pNextBox;
cout<<endl
<<"the largest box in first list is"
<<pBox->getLength()<<"by"<<pBox->getBreadth<<"by"<<pBox->getHeight()<<endl;
return 0;
}


问题 1 所以我的问题是,当调用
void TruckLoad::addBox(Box* pBox)
{
Package* pPackage=new Package(pBox); //产生一个箱子(Box)就产生一个package
if(pHead)
pTail->setNext(pPackage); //如果第一个箱子存在,将新产生的箱子放到最后
else
pHead=pPackage;
pTail=pPackage;
这个函数是即运行到主函数里那里时
int main()
{const int dimLimit=100;
srand((unsigned)time(0));
TruckLoad load1;
for(int i=0;i<10;i++)
load1.addBox(new Box(random(dimLimit),random(dimLimit),random(dimLimit)));

比如说产生的第5个箱子时,将package给了pTail->getnext()作为最后的package,那么然后产生的第6个箱子又给了
pTail->getnext() 这样的话 刚才pTail->getnext()的值是第5个箱子,现在变成了第六个package的值

那么第五个箱子不是没有给任何package了吗? 同样其他箱子也一样,,,
这样的话到了最后,那么就应该,就只有第一个箱子,和最后一个箱子给package了呀?他箱子都没有给packagele ,,!!!这样的话当要用到下一个package时(比如,pcurrent=pcurrent->getnext())就应该有问题了呀,,,,可结果居然没问题,,我实在不懂,!
我就想知道其他箱子,是怎么被存起来的,,


问题 2 还有truckload 的成员 PTail好像没什么用呀,,就是说怎么体现pTail是最后一个箱子,

真的恳求帮忙!!!
...全文
70 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
wengchaohui 2008-05-05
  • 打赏
  • 举报
回复
谢谢各位,该问题我已经解决了,当产生一个Box时 产生一个Package对象,赋予PHead和PTial,

此时PHead=PTail=package,,,产生第二个箱子时,将Package(2)给了Ptail的下一个,也就等于给了Phead的下一个,
再将package给Ptail;
产生第三个箱子时,将package给新Ptial 的下一个,,,
星羽 2008-05-04
  • 打赏
  • 举报
回复
1) pTail 总是指向最后一个,addBox 最后又这么一句 pTail=pPackage;

2)有用阿 addBox 里不是就用到了吗?

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧