0

我创建了一个名为“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++;

    }
}
4

3 回答 3

1

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

例如:

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

显然您的命名方案与此冲突,并且数据是 a 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,对吗?)。

于 2013-06-02T21:19:35.780 回答
0

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

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

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)。否则你会破坏你的链条并破坏列表。

于 2013-06-02T20:53:48.600 回答
0

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

我会修改传感器类如下。

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; 
    }
}
于 2013-06-02T21:12:11.217 回答