【问题标题】:Adding a pointer to a sensor to a linked list将指向传感器的指针添加到链表
【发布时间】:2013-06-02 20:42:04
【问题描述】:

我创建了一个名为“SensorNode”的类,每个 SensorNode 都有一个传感器链接列表。 SensorNode 的一个数据成员是一个名为 mySensors 的 SensorBlock(链表)指针。 mySensors 指向它所在的传感器节点所拥有的传感器链表中的第一个传感器。这是 SensorNode 的类声明:

class SensorNode {
    char* NodeName;
    int NodeID;
    LOCATION Node1;
    float batt;
    int func;
    SensorBlock *mySensors;


public:
    SensorNode(char *n, float x, float y, float z, int i, float ah);
    void print();
    void setOK(int o);
    int getOK();
    void setLOC(float longi, float lat, float h);
    int amIThisSensorNode(char *n);
    void addSensorToNode(sensor *s);
};

这是 SensorBlock 的类声明:

class SensorBlock {

    friend class SensorNode;
    SensorBlock * LLelement;
    sensor * SensEl;
};

在 addSensorToNode 函数中,如何将指向的传感器添加到链表中。基本上,我所拥有的内容如下,我试图弄清楚“else”语句中的内容。我查看了教程,但它们是用于创建新对象并添加它,这是用于添加指向对象的指针。

void SensorNode::addSensorToNode(sensor *s) {
    if(mySensors == '\0')
    {
        mySensors->SensEl = s;
    }
    else{
    //maybe something like this???
       // mySensors->SensEl =s;
       // mySensors->LLelement++;

    }
}

【问题讨论】:

  • 你想做什么?学习具有特定元素类型的数据结构似乎......没有效率? std::list<sensor*>有什么问题吗?
  • 这是一个作业,所以我有一些限制,并且必须以这种方式创建自己的链表。此外,std::list 是一个双向链表,这可能是他希望我们创建自己的任务的原因。虽然没有明确说明。我认为这是学习这个概念。因此,从概念上讲,我试图了解如何将传感器(通过指针)添加到正在创建的链表中。
  • 好的,很抱歉有怀疑。这看起来确实是一个异常混合的练习。还有std::sliststd::forward_list,顺便说一句:0
  • 哈哈不用担心,你是对的。哦,不知道那些。我仍然不能使用它们,但很高兴知道未来。谢谢!

标签: c++ class pointers linked-list


【解决方案1】:

单链表至少包含一个指向头节点的指针,每个节点都包含一个指向下一个节点的指针。

例如:

// list -> +-------+   +-------+
//         | next -+-> | next -+-> ...
//         | data  |   | data  |
//         +-------+   +-------+
struct ListNode {
    ListNode *next;
    void *data;
};
typedef ListNode *List;

显然你的命名方案与此冲突,数据是sensor,但你明白了。

现在,将其与您的代码进行比较,它看起来像:

  • 您的SensorBlock 确实是一个名称怪异的列表节点,
  • 你的SensorBlock::SensEl是节点的数据负载
  • 您的SensorBlock::LLelement 是下一个指针

如果奇怪的命名方案是您的障碍,您应该能够查看任何标准文本(或维基百科或其他任何内容)并了解单链表的工作原理。

所以,标准的push_front 看起来像这样:

void SensorNode::addSensorToNode(sensor *s) {
    SensorBlock *block = new SensorBlock; // create the new node
    block->SensEl = s;                    // attach its payload
    block->LLelement = mySensors;         // connect it to the list
    mySensors = block;                    // make it the new head
}

请注意,它会自动处理 NULL 头(您确实在构造函数中将 mySensors 初始化为 NULL,对吗?)。

【讨论】:

  • 谢谢!!我有 SensorBlock newBlock = new SensorBlock();新块->SensEl = s;新块->LLelement = NULL; mySensors->LLelement = newBlock;并不断收到错误,现在我看到第一行需要是 SensorBlock *newBlock = new SensorBlock;你是对的,我可以摆脱我的 if 语句,让这四行成为整个函数。再次感谢!
  • 一个关于这个的问题。如果我将 mySensors 设置为新头,那么它不再指向链表的开头,对吗?我需要让 mySensors 指向列表的开头,以便打印传感器列表;
  • 链表的开头就是你的开头。在这种情况下,单链表的自然顺序是 LIFO(后进先出)。这意味着它表现为堆栈而不是队列。如果你想要 FIFO 排序,你要么得到更慢的(线性时间)插入,要么除了头部之外还需要一个尾部指针,以及更复杂的逻辑。
【解决方案2】:

普通链表由一个锚点和一个结束指针组成,指向链表的最后一个元素。

所以你需要两个变量。这是一个可能的设置:

SensorBlock *Anchor = NULL, *EndPtr = Anchor;
if(!Anchor) EndPtr = Anchor = new SensorBlock(s);  //Assuming that you have a constructor, which takes this parameter.
else EndPtr = EndPtr->LLelement = new SensorBlock(s);

此代码首先检查锚点是否已设置。如果不是,则实例化锚点并将 EndPtr 设置为 Anchor。否则,通过创建一个新的 SensorBlock 元素将其“附加”到列表中,然后将其分配给“EndPtr->LLelement”,最后分配给 EndPtr 本身。

当您完成动态分配的 SensorBlock 元素后,请小心释放它们,如果您删除任何元素,请务必更新所有指向它的引用。 (Anchor、EndPtr、前一个元素的LLelement)。否则你会破坏你的链条并破坏列表。

【讨论】:

    【解决方案3】:

    这似乎有点奇怪: 我会用标准结构来实现它。 如果您必须实现自定义链接列表,您可能需要更改一些内容。

    我会修改传感器类如下。

    class sensor
    {
        //members
        //functions
    
        sensor* next_sensor;
    }
    

    然后我会放弃 SensorBlock 类。

    class SensorNode 
    {
        private:
            //your members and methods
            sensor *first_sensor;
        public:
            //...
            void addSensorToNode(sensor *s);
    };
    

    如何将传感器添加到链表中

    void SensorNode::addSensorToNode(sensor *s) 
    {
        sensor* current = first_sensor;
        if(current == NULL)
        {
            first_sensor = s;
        }
        else
        {
            while(current->next_sensor != NULL)
            {
                current = current->next_sensor;
            }
            current->next_sensor = s; 
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-02
      • 2013-12-25
      • 2012-08-11
      • 1970-01-01
      • 1970-01-01
      • 2018-04-10
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多