链表实现c ++

时间:2018-05-17 18:50:52

标签: c++

我正在尝试使用召集结构和指针按ID存储数据, 但我只能存储第一个值。这是我第一次尝试动态地使用这种方法存储数据,所以我不确定我是否以正确的方式使用node->p_nextnode->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

1 个答案:

答案 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),你应该能够从双方添加元素。

我希望你解决它^ _ ^