簡體   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