2013-06-20 37 views
0

我对C++相当陌生。如何显示链接列表中的特定节点?

我有这样的代码分配,我不太明白这一切,但我不得不使程序在给最终用户一个选项来调用任何部分号码和车型年/引擎没有。这是进入。

我不知道如何去做这个任务...也许有每种节点的某种id,所以我可以回想起来?

或者是我使用数组或矢量数据结构重写程序的唯一选择吗?

 #include <iostream> 

    using namespace std; 

    typedef unsigned long ULONG; 
    typedef unsigned short USHORT; 


    // **************** Part ************ 

    // Abstract base class of parts 
    class Part 
    { 
    friend void showPart(); 

    public: 
     Part():itsPartNumber(1) {} 
     Part(ULONG PartNumber):itsPartNumber(PartNumber){} 
     virtual ~Part(){}; 
     ULONG GetPartNumber() const { return itsPartNumber; } 
     virtual void Display() const =0; // must be overridden 
    private: 
     ULONG itsPartNumber; 
    }; 

    // implementation of pure virtual function so that 
    // derived classes can chain up 
    void Part::Display() const 
    { 
     cout << "\nPart Number: " << itsPartNumber << endl; 
    } 
    // **************** Car Part ************ 

    class CarPart : public Part 
    { 
    friend void showPart(); 

    public: 
     CarPart():itsModelYear(94){} 
     CarPart(USHORT year, ULONG partNumber); 
     virtual void Display() const 
     { 
      Part::Display(); cout << "Model Year: "; 
      cout << itsModelYear << endl; 
     } 
    private: 
     USHORT itsModelYear; 
    }; 

    CarPart::CarPart(USHORT year, ULONG partNumber): 
     itsModelYear(year), 
     Part(partNumber) 
    {} 


    // **************** AirPlane Part ************ 

    class AirPlanePart : public Part 
    { 
    friend void showPart(); 

    public: 
     AirPlanePart():itsEngineNumber(1){}; 
     AirPlanePart(USHORT EngineNumber, ULONG PartNumber); 
     virtual void Display() const 
     { 
      Part::Display(); cout << "Engine No.: "; 
      cout << itsEngineNumber << endl; 
     } 
    private: 
     USHORT itsEngineNumber; 
    }; 

    AirPlanePart::AirPlanePart(USHORT EngineNumber, ULONG PartNumber): 
     itsEngineNumber(EngineNumber), 
     Part(PartNumber) 
    {} 

    // **************** Part Node ************ 
    class PartNode 
    { 
    public: 
     PartNode (Part*); 
     ~PartNode(); 
     void SetNext(PartNode * node) { itsNext = node; } 
     PartNode * GetNext() const; 
     Part * GetPart() const; 
     private: 
     Part *itsPart; 
     PartNode * itsNext; 
     }; 

     // PartNode Implementations... 

     PartNode::PartNode(Part* pPart): 
     itsPart(pPart), 
     itsNext(0) 
     {} 

     PartNode::~PartNode() 
     { 
     delete itsPart; 
     itsPart = 0; 
     delete itsNext; 
     itsNext = 0; 
     } 

     // Returns NULL if no next PartNode 
     PartNode * PartNode::GetNext() const 
     { 
      return itsNext; 
     } 

     Part * PartNode::GetPart() const 
     { 
     if (itsPart) 
      return itsPart; 
     else 
      return NULL; //error 
     } 

     // **************** Part List ************ 
     class PartsList 
     { 
     public: 
     PartsList(); 
     ~PartsList(); 
     // needs copy constructor and operator equals! 
     Part*  Find(ULONG & position, ULONG PartNumber) const; 
     ULONG  GetCount() const { return itsCount; } 
     Part*  GetFirst() const; 
     static  PartsList& GetGlobalPartsList() 
     { 
      return GlobalPartsList; 
     } 
     void  Insert(Part *); 
     void  Iterate(void (Part::*f)()const) const; 
     Part*  operator[](ULONG) const; 
     private: 
     PartNode * pHead; 
     ULONG itsCount; 
     static PartsList GlobalPartsList; 
     }; 

     PartsList PartsList::GlobalPartsList; 

     // Implementations for Lists... 

     PartsList::PartsList(): 
     pHead(0), 
     itsCount(0) 
     {} 

     PartsList::~PartsList() 
     { 
     delete pHead; 
     } 

     Part* PartsList::GetFirst() const 
     { 
     if (pHead) 
      return pHead->GetPart(); 
     else 
      return NULL; // error catch here 
     } 

     Part * PartsList::operator[](ULONG offSet) const 
     { 
     PartNode* pNode = pHead; 

     if (!pHead) 
      return NULL; // error catch here 

     if (offSet > itsCount) 
      return NULL; // error 

     for (ULONG i=0;i<offSet; i++) 
      pNode = pNode->GetNext(); 

     return pNode->GetPart(); 
     } 

     Part* PartsList::Find(ULONG & position, ULONG PartNumber) const 
     { 
     PartNode * pNode = 0; 
     for (pNode = pHead, position = 0; 
       pNode!=NULL; 
       pNode = pNode->GetNext(), position++) 
     { 
      if (pNode->GetPart()->GetPartNumber() == PartNumber) 
       break; 
     } 
     if (pNode == NULL) 
      return NULL; 
     else 
      return pNode->GetPart(); 
     } 

     void PartsList::Iterate(void (Part::*func)()const) const 
     { 
     if (!pHead) 
      return; 
     PartNode* pNode = pHead; 
     do 
      (pNode->GetPart()->*func)(); 
     while (pNode = pNode->GetNext()); 
     } 

     void PartsList::Insert(Part* pPart) 
     { 
     PartNode * pNode = new PartNode(pPart); 
     PartNode * pCurrent = pHead; 
     PartNode * pNext = 0; 

     ULONG New = pPart->GetPartNumber(); 
     ULONG Next = 0; 
     itsCount++; 

     if (!pHead) 
     { 
      pHead = pNode; 
      return; 
     } 

     // if this one is smaller than head 
     // this one is the new head 
     if (pHead->GetPart()->GetPartNumber() > New) 
     { 
      pNode->SetNext(pHead); 
      pHead = pNode; 
      return; 
     } 

     for (;;) 
     { 
      // if there is no next, append this new one 
      if (!pCurrent->GetNext()) 
      { 
       pCurrent->SetNext(pNode); 
       return; 
      } 

      // if this goes after this one and before the next 
      // then insert it here, otherwise get the next 
      pNext = pCurrent->GetNext(); 
      Next = pNext->GetPart()->GetPartNumber(); 
      if (Next > New) 
      { 
       pCurrent->SetNext(pNode); 
       pNode->SetNext(pNext); 
       return; 
      } 
      pCurrent = pNext; 
     } 
     } 

     int main() 
     { 
     PartsList pl = PartsList::GetGlobalPartsList(); 
     Part * pPart = 0; 
     ULONG PartNumber; 
     USHORT value; 
     ULONG choice; 

     while (1) 
     { 
      cout << "(0)Quit (1)Car (2)Plane: "; 
      cin >> choice; 

      if (!choice) 
       break; 

      cout << "New PartNumber?: "; 
      cin >> PartNumber; 

      if (choice == 1) 
      { 
       cout << "Model Year?: "; 
       cin >> value; 
       pPart = new CarPart(value,PartNumber); 
      } 
      else 
      { 
       cout << "Engine Number?: "; 
       cin >> value; 
       pPart = new AirPlanePart(value,PartNumber); 
      } 

      pl.Insert(pPart); 
     } 
     void (Part::*pFunc)()const = &Part::Display; 
     pl.Iterate(pFunc); 

     cout << "\n\n\nThere are " << pl.GetCount() << " items in the list" << endl; 


     return 0; 
    } 

我试过在PartsList类中使用Find()。 Find()是否获取partnumber并返回零件的地址?

我写这篇取消引用检索到的地址,但它给我的错误no match for 'operator<<' in 'std::cout << * show'

int findnumber; 
     ULONG position; 
     cout << "Enter Partnumber" << endl; 
     cin >> findnumber; 
     Part* show = pl.Find(position, findnumber); 
     cout << *show; 

我这样做都是错的? D:请给我看看......

+0

如果你更清楚你的问题会更好 – 0decimal0

回答

1

函数Find获取零件号,但返回一个指向零件的指针,该零件与零件的地址不同(该零件的参考位置将由&表示)。另外,Find引用一个名为'position'的变量,因此在调用Find函数后,传入'position'的变量将包含该部分在链接列表中的值。

您无法使用< <运算符的原因在于它尚未提供给Part类。但是,从提供的源代码看,您的目标看起来像是了解多态性,而不是尝试使用< <,请在您找到的部分上调用Display函数。如: -

Part* part = pl.Find(position, findnumber); 
part->Display(); 

这将显示相​​关类型的部件中的文本,因此,如果部分返回了一个CarPart,该CarPart的显示功能将被调用,而如果部分是飞机的一部分,它的显示函数被调用。

如果你想使用流运算符(< <)你需要重载IO操作符,你可以阅读更多关于here

+0

非常感谢Merlin你的回答帮助了我很多,它的工作。我会尝试更好地理解多态性。谢谢 :) –

0

PartsList类已经有一个Find()方法可以用来根据其partnumber检索任何零件。然后可以调用该部分的Display()方法。

+0

就我的理解,Find()取得一个零件编号并返回该零件的地址,对吗?我如何将它分配给指针并对其进行解引用? –