C++ 将指向传感器的指针添加到链接列表

C++ 将指向传感器的指针添加到链接列表,c++,class,pointers,linked-list,C++,Class,Pointers,Linked List,我创建了一个名为“SensorNode”的类,每个SensorNode都有一个传感器的链接列表。SensorNode的一个数据成员是名为mySensors的SensorBlock(链表)指针。mySensors指向传感器节点所属传感器链表中的第一个传感器。以下是SensorNode的类声明: class SensorNode { char* NodeName; int NodeID; LOCATION Node1; float batt; int func

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

    }
}

普通链表由一个锚和一个末端指针组成,末端指针指向链表的最后一个元素

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

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设置为锚点。否则,通过创建新的SensorBlock元素将其“附加”到列表中,然后将其分配给“EndPtr->lleElement”,最后分配给EndPtr本身

使用完动态分配的SensorBlock元素后,请小心释放这些元素,如果删除了任何元素,请确保更新指向它的所有引用。(锚定、端PTR、上一个元件的L元件)。否则,您将破坏您的链并破坏列表。

这似乎有点奇怪: 我会用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; 
    }
}

最起码,一个单链接列表包含一个指向头部节点的指针,每个节点包含一个指向下一个节点的指针

例如:

// list -> +-------+   +-------+
//         | next -+-> | next -+-> ...
//         | data  |   | data  |
//         +-------+   +-------+
struct ListNode {
    ListNode *next;
    void *data;
};
typedef ListNode *List;
很明显,您的命名方案与此相冲突,数据是一个
传感器
,但您明白了

现在,将其与您的代码进行比较,结果如下:

  • 您的
    SensorBlock
    实际上是一个名称怪异的列表节点
  • 您的
    SensorBlock::SensEl
    是节点的数据有效负载
  • 您的
    SensorBlock::llement
    是下一个指针
如果奇怪的命名方案是您的障碍,那么您应该能够查看任何标准文本(或wikipedia,或其他内容),并了解单链接列表是如何工作的

因此,一个标准的
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
}

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

你想干什么?学习具有特定元素类型的数据结构似乎。。。效果不佳的
std::list
有什么问题吗?这是一个作业,所以我有一些限制,必须以这种方式创建自己的链表。另外,std::list是一个双链接列表,这可能就是为什么他希望我们为这个任务创建自己的列表。虽然没有明确说明。我想这是为了学习这个概念。所以,从概念上讲,我试图理解如何将传感器(通过指针)添加到正在创建的链表中。好的,很抱歉对此表示怀疑。这看起来确实是一个不同寻常的混合练习。另外,还有
std::slist
std::forward\u list
,顺便说一句:哈哈,别担心,你说得对。哦,我不知道这些。我仍然不能使用它们,但很高兴知道未来的情况。非常感谢。非常感谢。我有SensorBlock newBlock=新SensorBlock();新锁->传感器=s;newBlock->LLelement=NULL;mySensors->LLelement=新锁;不断出现错误,现在我看到第一行需要是SensorBlock*newBlock=newsensorblock;你是对的,我可以去掉if语句,让这四行成为整个函数。再次感谢!不过有一个问题。如果我把mySensors设置为新的头,那么它就不再指向链表的开头了,对吗?我需要让我的传感器指向列表的开头,以便打印传感器列表;链表的开头就是你所说的开头。在这种情况下,单链表的自然顺序是后进先出。这意味着它表现为堆栈而不是队列。如果您想要FIFO排序,您要么得到较慢的(线性时间)插入,要么除了头部之外还需要一个尾部指针,以及更复杂的逻辑。