【问题标题】:Remove a data from a node从节点中删除数据
【发布时间】:2012-03-22 12:59:30
【问题描述】:
#include <conio.h>
#include <iostream>
#include <string>

using namespace std;

class MysticalBag
{
private:
    int useCount;
    int content;
    string itemName;

public:

    MysticalBag *next_ptr;

    void setAttributes()
    {
        //Called for showing the items without any placement of item
        useCount = 1;
        content = 5;
        itemName = "Healing Potion";
    }

    int takeUseCount()
    {
        return useCount;
    }

    int takeContent()
    {
        return content;
    }

    string takeItemName()
    {
        return itemName;
    }

    void setAttributes(int userCount, int content, string itemName)
    {
        this->useCount = useCount;
        this->content = content;
        this->itemName = itemName;
    }

    void itemAdder()
    {
        cout << "Enter use count (1-3) " <<endl;
        cin >> useCount;
        cout << "Enter content (1.0 - 100.0) " <<endl;
        cin >> content;
        cout << "Enter item name as text" << endl;
        cin >> itemName;
        cout<< itemName <<" is added in the bag."<< endl;
    }

    void showBag()
    {
        cout << "Showing bag contents" << endl << endl;
        cout << itemName << endl;
        cout << "U - "<< useCount <<", C - "<< content << endl;
    }
};



int main()
{
    char choice1,choice2;
    choice1 = 0;

    MysticalBag *head, *tail, *navigator;

    navigator = new MysticalBag();
    navigator->setAttributes();
    head = navigator;
    tail = navigator;

    tail->next_ptr = NULL;

    while(choice1 !='x')
    {
        cout << "What do you want to do with the bag?" << endl;
        cout << "(a)dd item" << endl;
        cout << "(r)emove item" << endl;
        cout << "(s)how items" <<endl;
        cout << "e(x)it" <<endl;
        cin >> choice1;

        if(choice1 == 'a')
        {
            navigator = new MysticalBag();
            if(head==NULL)
            {

                head=navigator;

                tail=navigator;

                tail->next_ptr=NULL;
            }

            navigator->itemAdder();
            tail->next_ptr = navigator;
            tail = navigator;
            tail->next_ptr = NULL;
        }

        else if(choice1 == 'r')
        {
            navigator = head;
            tail = head;

            while(navigator->next_ptr != NULL)
                {
                    navigator = navigator->next_ptr;
                    tail = navigator;
                }

            cout << "Do you want to remove "<< navigator->takeItemName() <<" from your bag? (y/n)"<< endl;
            cin >> choice2;

            if(choice2 == 'y')
            {
                navigator = head;
                if(navigator == head)

                //I am stuck at this point!

                navigator = NULL;

            cout << "Item removed." << endl;

            tail = head;

            while(tail->next_ptr != NULL)
                {
                    tail = tail->next_ptr;
                }
            }
            else
            {
                cout<< "No item removed" <<endl;
            }

            navigator = head;

            if(navigator == head && navigator == tail)
            {
                navigator = NULL;
                head = NULL;
                tail = NULL;
            }
            else
            {
                navigator = tail;
                navigator = NULL;
                tail = NULL;

                tail = head;

                while(tail->next_ptr != NULL)
                {
                    tail = tail->next_ptr;
                }
            }
        }

        else if(choice1 != 'x')
        {
            navigator = head;
            while(navigator != NULL)
            {
                navigator->showBag();
                navigator = navigator->next_ptr;
            }
        }
    }
    getch();
}

我的目标是从节点中删除数据。 用户可以在节点中放入数据,也就是Navigator。

我的想法是将导航器指向头部并让头部调用 setAttributes()。这将显示“治疗药水”。但是,如果用户添加到项目。如何一次只删除一项?

【问题讨论】:

    标签: c++ list class pointers


    【解决方案1】:

    您只能移除添加到包中的最后一件物品,还是可以移除任何物品?更一般的情况是询问链表中的删除。

    要从链表(包)中删除节点(项目),您需要知道要删除的项目的父节点。节点的父节点是 next_ptr 是节点的节点。所以在循环中,你需要跟踪 navigator 的父级:

    while(navigator->next_ptr != NULL)
        {
            /* a sample list */
            /* "parent" --> "navigator" --> "navigator->next_ptr" */
            parent = navigator; /* now we know who points to navigator */
            navigator = navigator->next_ptr;
            tail = navigator;
        }
    

    一旦我们知道了 navigator 的父级,移除 navigator 所需要做的就是:

    parent->next_ptr = navigator->next_ptr;
    /* now the list looks like */
    /* "parent" --> "navigator->next_ptr" */
    

    现在导航器已从包中移除。

    我认为您的许多 while 循环仍然存在问题,但修复它们需要更多地了解您的意图。

    【讨论】:

    • 如果您创建一个名为 parent 的新包指针,我的其余代码可以放入以删除包中的最后一项。
    【解决方案2】:

    这是一个列表吗?为什么不在自定义类中使用 std::list?

    【讨论】:

      【解决方案3】:

      嗯,简而言之,您要问的是“如果我有一个指向类成员的指针,我如何访问一个类函数?”至少我是这么看的。

      #include "Items.h" //let me assume you have some sort of struct or class for items in your bag
      class Bag : public player { //player would give access to attributes like HP/MP/Who Owns the bag, etc..
          protected:
              vector<Item*> Contents; 
              int MaxItems;
      
          public:
              Bag();
              Store(Item* It);
              Remove(Item* It);
              UseItem(Item* It);
      };
      Bag::Store(Item* It) {
          if(Contents.size() >= MaxItems) return;
          for( int i = 0; i < Contents.size(); i++ ) {
              if(It == Contents[i] ) {
                  return;
              }
          }
          Contents.push_back(It);
      }
      Bag::Remove(Item* It) { 
          for(int i = 0; i < Contents.size(); i++) {
              if( It == Contents[i] ) {
                  Contents.erase(Contents.begin() + i);
                  break;
          }
      }        
      Bag::UseItem(Item* It) {
          if(!(It->Usable())) { return };
          It->Use();
      }
      
      class Item { 
          protected:
             int ItemType; //suggest you use some enum for this
          public:
             Item();
             virtual bool Usable();
             virtual void Use();
      };
      
      Item::Item() { };
      bool Item::Usable() {
          //Purely Virtual
      }
      void Item::Use() { 
           //Same
      }
      
      class Potion : public Item {
          protected:
             int PotionType; //Again, I'd enum this
          public: 
             Potion();
             virtual bool Useable();
             virtual void Use();
      }
      
      Potion::Potion() { ItemType = POTION; }
      bool Potion::Useable() { return true; }
      void Potion::Use() { //Purely Virtual }
      
      class HealPotion : public Potion {
          protected:
              int Strength; //who knows, # of hp to heal
          public:
              HealPotion();
              virtual void Use();
      };
      HealPotion::HealPotion() { PotionType = Heal; Strength = 45; }
      void HealPotion::Use() { Owner->ChangeHits(Strength); 
          this->RemoveItem(this); } //Now you might also want to destroy the item to free up memory
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多