C++ 将指向传感器的指针添加到链接列表
我创建了一个名为“SensorNode”的类,每个SensorNode都有一个传感器的链接列表。SensorNode的一个数据成员是名为mySensors的SensorBlock(链表)指针。mySensors指向传感器节点所属传感器链表中的第一个传感器。以下是SensorNode的类声明: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
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
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排序,您要么得到较慢的(线性时间)插入,要么除了头部之外还需要一个尾部指针,以及更复杂的逻辑。