[英]Linked list implementation c++
我正在嘗試使用常規結構和指針按ID存儲數據,但是我只能存儲第一個值。 這是我第一次嘗試使用這種方法動態存儲數據,因此我不確定我node->p_prev
以正確的方式使用了node->p_next
和node->p_prev
。
有人可以看一下並告訴我我的實現是否做錯了嗎?
清單.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
。
這里有些事情肯定是錯誤的。
1)標頭中有一個添加方法uint8_t add(uint16_t ID,uint8_t數據),但未實現。 您可以在LookingforRecord方法中使用向模塊添加新元素。 我建議您將兩者分開,然后彼此調用(如果您確實需要,我認為您不需要)
2)您使用uint8_t batch_size變量來存儲ID,即uint16_t類型。 我相信你知道為什么它不好:D
3)您的DeleteID並不完全正確。 如果要刪除第一個元素,則應將下一個元素的prev指針為空,否則它將指向垃圾。
4)在您的protected(為什么不私有)部分中同時使用第一個和最后一個指針。 並據此打電話給他們。 這很令人困惑。 如果有最后一個指針,則添加新節點會容易得多。
5)您添加錯誤。 添加新節點時,請執行此操作
if (m_p_node != 0)
m_p_node->p_prev = p_node;
但是您需要LAST元素的p_next指向剛剛添加的新元素。
6)如果它是一個前向列表,則只需要p_next,但是如果它是一個雙鏈表(其中需要p_prev和p_next),則應該能夠從兩側添加元素。
我希望你能解決它^ _ ^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.