繁体   English   中英

链表实现C ++

[英]Linked list implementation c++

我正在尝试使用常规结构和指针按ID存储数据,但是我只能存储第一个值。 这是我第一次尝试使用这种方法动态存储数据,因此我不确定我node->p_prev以正确的方式使用了node->p_nextnode->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_nodem_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM