微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

类中的链表不会删除元素

如何解决类中的链表不会删除元素

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

struct Node
{
    int x;
    Node* next = nullptr;
};

typedef Node* nodeptr;

class L
{
    private: 
        nodeptr head = nullptr;
        int lengthCount = 0;
    public: 
        void add(const int data);
        void print();
        void find(const int data);
        void pop(const int data);
        void listSize();
};

void L:: listSize()
{
    cout << "The size of the link list is:  " << lengthCount << endl;
}

void L::add(const int data)
{
    lengthCount += 1;
    Node* newNode = new Node; 
    newNode->x = data;  
    
    if(head == nullptr)
    {
        head = newNode; 
    }
    else
    {
        nodeptr temp = head;
        while(temp->next != nullptr)
        {
            temp = temp->next;
        }
        temp->next = newNode;
    }
}

void L::pop(const int data)
{
    if(head == nullptr)
    {
        cout << "Empty List" << endl;
    }   
    else if(head->x == data)
    {
        head = head->next;
    }
    else
    {
        nodeptr temp = head->next; 

        while(temp != nullptr)
        {
            if(temp-> x != data)
            {
                temp = temp->next;
            }
            else
            { 
                if(temp->next != nullptr)
                {   
                    temp = temp->next;
                }
                else
                {
                    temp->next = nullptr;
                }
                break;
            }
        }
    }
}

void L::find(const int data)
{
    if(head == nullptr)
    {
        cout << "Empty List" << endl;
    }
    else 
    {
        nodeptr temp = head;
        
        for(temp; temp != nullptr; temp = temp->next)
        {
            if(temp->x == data)
            {
                cout << "Found" << endl;
                break;
            }
            if(temp->next == nullptr)
                cout << "Not Found" << endl;    
        }
    }
}

void L::print()
{
    nodeptr temp = head;
    string line(20,'-');
    cout << "Print list" << endl;
    cout << line << endl;
    while(temp != nullptr)
    {
        cout << temp->x << endl;
        temp = temp->next;
    }
    cout << line << endl;
}

int main()
{
    vector <int> val;
    for(int i = 0; i < 10; i++)
        val.push_back(5*i);
    cout << "Printing list" << endl;
    for(auto i : val)
            cout << i << " ";
    cout << endl;
    L listObj;
    cout << "Adding list" << endl;
    for(auto i : val)
        listObj.add(i);
    listObj.print();
    listObj.listSize();
    listObj.find(15);
    listObj.print();
    cout << "popping 10" << endl;
    listObj.pop(10);
    listObj.print();
}

我遇到的问题是,我无法在使用类时修改链表的实际内存。

我不确定我做错了什么。

如果添加有效,我会说删除值的想法也应该有效。

remove 函数被称为 pop。 pop 函数没有删除值 10,所以我不知道为什么。

如果它是一个不在类中的函数,我会说我需要用 & 运算符传递一个头指针,然后我实际上可以修改该值。

请告诉我我哪里做错了。

谢谢

解决方法

你的pop方法不正确,你还必须将当前节点与上一个下一个链接。应该是这样的

void L::pop(const int data)
{
    if(head == nullptr)
    {
        cout << "Empty List" << endl;
    }   
    else if(head->x == data)
    {
        nodeptr temp = head;
        head = head->next;
        delete temp;
    }
    else
    {
        nodeptr temp = head->next; 
        nodeptr prev = head;

        while(temp != nullptr)
        {
            if(temp-> x != data)
            {
                prev = temp;
                temp = temp->next;
            }
            else
            {
                if(temp->next != nullptr)
                {   
                    prev -> next = temp -> next;
                    delete temp;
                }
                else
                {
                    delete temp;
                    prev -> next = nullptr;
                }
                break;
            }
        }
    }
}
,

您需要以某种方式跟踪链表的“前一个”节点。有很多方法可以做到,但最清楚的可能是:

void L::pop(const int data) {
    if(head == nullptr) {
        cout << "Empty List" << endl;
        return;
    }   
    if(head->x == data) {
        node *temp = head;
        head = head->next;
        delete temp;
        return;
    }
    int *prev = head;
    int *temp = head->next;
    while (temp != null) {
        if (temp->x != data) {
            prev = prev->next;
            temp = temp->next;
        } else { 
            prev->next = temp->next;
            delete temp;
            return;
        }
    }
}
,

除了已经给出的答案之外,还有一种无需一直跟踪前一个元素的变体:

for(Node* tmp = head; tmp->next; tmp = tmp->next;)
{
    if(tmp->next->x == data)
    {
        // OK,one intermediate pointer we need anyway,but we need it
        // only once
        Node* del = tmp->next;
        tmp->next = tmp->next->next;
        delete del;
        break;
    }
}

作为小奖励的 for 循环更紧凑一些,但这只是个人喜好问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。