我正在尝试使用召集结构和指针按ID存储数据,
但我只能存储第一个值。这是我第一次尝试动态地使用这种方法存储数据,所以我不确定我是否以正确的方式使用node->p_next
和node->p_prev
。
有人可以看看并告诉我,如果我在实施中做错了吗?
List.h
class list
{
public:
// Construction /destruction
list();
virtual ~list();
void DeleteAll();
void DeleteID(uint16_t ID);
uint8_t add(uint16_t ID, uint8_t data);
void printf(uint16_t ID);
struct node
{
uint16_t ID;
uint8_t data;
node * p_prev;
node * p_next;
};
protected:
node * LookingforRecord(uint16_t id, bool add = false);
node * m_p_node;
};
List.cpp
#include "list.h"
uint16_t ID = 0;
// Construction
list::list()
{
m_p_node = 0;
}
// Destruction
list::~list()
{
DeleteAll();
}
void list::printf(uint16_t ID)
node * p_node = LookingforRecord(ID, false);
if (p_node != 0)
{
printf("p_node->ID %d \r\n", p_node->ID);
printf("p_node->data %d \r\n", p_node->data);
}
}
uint8_t list::add(uint16_t ID, uint8_t data)
{
uint8_t batch_size = 0;
// Find the ID, creating one if necessary
node * p_node = LookingforRecord(ID, true);
if (p_node != 0)
{
//store ID and data
p_node->ID= ID;
p_node->data = data;
batch_size = ID;
}
return batch_size;
}
list::Node * list::LookingforRecord(uint16_t ID, bool add)// Finds a ID
{
node * p_node= m_p_node;
while (p_node != NULL)
{
// Find by ID
if(p_node->ID == ID)
return p_node;
p_node = p_node->p_next; // Move on to the next one
}
if(add)
{
if ((p_node = new node) != 0)
{
memset(p_node, 0, sizeof(node));
p_node->ID = ID;
p_node->data = m_p_node;
**p_node->p_next = m_p_node;**
if (m_p_node != 0)
m_p_node->p_prev = p_node;
else
m_p_node = p_node;
}
}
return p_node;
}
void list::DeleteAll() // Deletes everything
{
while (m_p_node != 0)
{
DeleteID(m_p_node->ID);
}
}
void list::DeleteID(uint16_t ID) // Deletes ID
{
// Find by ID
node * p_node = LookingforRecord(ID, false);
if (p_node != 0)
{
// Unlink it from the list
if(p_node->p_prev != 0)
p_node->p_prev->p_next = p_node->p_next;
if (p_node->p_next != 0)
p_node->p_next->p_prev = p_node->p_prev;
if (m_p_node == p_node)
m_p_node = p_node->p_next;
delete p_node;
}
}
我主要担心的是LookingforRecord
。它没有进入if(p_node->ID == ID)
,也没有从p_node
更新m_p_node
,每次代码进入lookingforRecord
时都会更新pyautogui
。
答案 0 :(得分:0)
以下是一些绝对错误的事情。
1)你的标题中有一个add方法uint8_t add(uint16_t ID,uint8_t data),但你没有实现它。您可以在LookingforRecord方法中为模块添加新元素。我建议你将这两个人分开,然后互相呼叫(如果你真的需要它,我相信你不需要)
2)您使用uint8_t batch_size变量来存储ID,类型为uint16_t。我相信你知道它为什么不好:D
3)您的DeleteID不完全正确。如果要删除第一个元素,则应该使下一个元素的prev指针为空,否则它将指向垃圾。
4)在受保护的(为什么不是私有的)部分使用第一个和最后一个指针。并据此打电话给他们。这非常令人困惑。如果你有最后一个指针,那么添加一个新节点要容易得多。
5)你加错了。添加新节点时,您可以执行此操作
if (m_p_node != 0)
m_p_node->p_prev = p_node;
但是你需要你的LAST元素的p_next指向你刚刚添加的新元素。
6)如果它是一个转发列表,你只需要p_next,但如果它是一个双向链表(你需要p_prev和p_next),你应该能够从双方添加元素。
我希望你解决它^ _ ^