我无法删除双向链表中的最小数然后再删除下一个

问题描述 投票:0回答:1

所以,这三天我一直在尝试删除双向链表的最小指针。它总是在我使用 min = a.erase(min) 时崩溃。 我做了研究,说你“应该”首先使用“delete(*min)”删除,但它不会编译。现在我专注于删除一个值,然后我将添加 for 循环以再次对每个小数字执行 n 次(即 - 我必须找到最小值,打印,删除,重复直到结束)

我有一个可以工作的代码,但它不会一直工作,让我重新开始。

#include <cstdlib>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
typedef int Object;

using namespace std;
#include <cstdlib>
typedef int Object;

class List{
private:
// The basic doubly linked list node.
// Nested inside of List, can be public
// because the Node is itself private
    struct Node
    {
        Object  data;
        Node   *prev;
        Node   *next;

        Node(const Object & d = Object(), Node * p = NULL, Node * n = NULL)
            : data(d), prev(p), next(n) { }
    };

public:
    class const_iterator
    {
    public:

    // Public constructor for const_iterator.
        const_iterator() : current(NULL)
        { }

    // Return the object stored at the current position.
    // For const_iterator, this is an accessor with a
    // const reference return type.
        const Object & operator* () const
        {
            return retrieve();
        }

        const_iterator & operator++ ()
        {
            current = current->next;
            return *this;
        }

    const_iterator operator++ (int)
    {
        const_iterator old = *this;
        ++(*this);
        return old;
    }

    const_iterator & operator-- ()
    {
        current = current->prev;
        return *this;
    }

    const_iterator operator-- (int)
    {
        const_iterator old = *this;
        --(*this);
        return old;
    }

    bool operator== (const const_iterator & rhs) const
    {
        return current == rhs.current;
    }

    bool operator!= (const const_iterator & rhs) const
    {
        return !(*this == rhs);
    }

    protected:
    Node *current;

    // Protected helper in const_iterator that returns the object
    // stored at the current position. Can be called by all
    // three versions of operator* without any type conversions.
    Object & retrieve() const
    {
        return current->data;
    }

    // Protected constructor for const_iterator.
    // Expects a pointer that represents the current position.
    const_iterator(Node *p) : current(p)
    { }

    friend class List;
    };

    class iterator : public const_iterator
    {
    public:

    // Public constructor for iterator.
    // Calls the base-class constructor.
    // Must be provided because the private constructor
    // is written; otherwise zero-parameter constructor
    // would be disabled.
    iterator()
    { }

    Object & operator* ()
    {
        return retrieve();
    }

    // Return the object stored at the current position.
    // For iterator, there is an accessor with a
    // const reference return type and a mutator with
    // a reference return type. The accessor is shown first.
    const Object & operator* () const
    {
        return const_iterator::operator*();
    }

    iterator & operator++ ()
    {
        current = current->next;
        return *this;
    }

    iterator operator++ (int)
    {
        iterator old = *this;
        ++(*this);
        return old;
    }

    iterator & operator-- ()
    {
        current = current->prev;
        return *this;
    }

    iterator operator-- (int)
    {
        iterator old = *this;
        --(*this);
        return old;
    }

    protected:
    // Protected constructor for iterator.
    // Expects the current position.
    iterator(Node *p) : const_iterator(p)
    { }

    friend class List;
    };

public:
    List()
    {
        init();
    }

    ~List()
    {
    clear();
    delete head;
    delete tail;
    }

    List(const List & rhs)
    {
    init();
    *this = rhs;
}

const List & operator= (const List & rhs)
{
    if (this == &rhs)
        return *this;
    clear();
    for (const_iterator itr = rhs.begin(); itr != rhs.end(); ++itr)
        push_back(*itr);
    return *this;
}

// Return iterator representing beginning of list.
// Mutator version is first, then accessor version.
iterator begin()
{
    return iterator(head->next);
}

const_iterator begin() const
{
    return const_iterator(head->next);
}

// Return iterator representing endmarker of list.
// Mutator version is first, then accessor version.
iterator end()
{
    return iterator(tail);
}

const_iterator end() const
{
    return const_iterator(tail);
}

// Return number of elements currently in the list.
int size() const
{
    return theSize;
}

// Return true if the list is empty, false otherwise.
bool empty() const
{
    return size() == 0;
}

void clear()
{
    while (!empty())
        pop_front();
}

// front, back, push_front, push_back, pop_front, and pop_back
// are the basic double-ended queue operations.
Object & front()
{
    return *begin();
}

const Object & front() const
{
    return *begin();
}

Object & back()
{
    return *--end();
}

const Object & back() const
{
    return *--end();
}

void push_front(const Object & x)
{
    insert(begin(), x);
}

void push_back(const Object & x)
{
    insert(end(), x);
}

void pop_front()
{
    erase(begin());
}

void pop_back()
{
    erase(--end());
}

// Insert x before itr.
iterator insert(iterator itr, const Object & x)
{
    Node *p = itr.current;
    theSize++;
    return iterator(p->prev = p->prev->next = new Node(x, p->prev, p));
}

// Erase item at itr.
iterator erase(iterator itr)
{
    Node *p = itr.current;
    iterator retVal(p->next);
    p->prev->next = p->next;
    p->next->prev = p->prev;
    delete p;
    theSize--;

    return retVal;
}

iterator erase(iterator start, iterator end)
{
    for (iterator itr = start; itr != end; )
        itr = erase(itr);

    return end;
}

private:
int   theSize;
Node *head;
Node *tail;

void init()
{
    theSize = 0;
    head = new Node;
    tail = new Node;
    head->next = tail;
    tail->prev = head;
}
};

int main()
{
    size_t n;
    cout << "Please enter the amount of random numbers to be generated " <<           endl;
    cin >> n;
    int randomRange;
    List a;

    srand(time(NULL));


    for (int i = 0; i < n;i++) {
        randomRange = rand() % 10000 + 1;
        a.insert(a.end(), randomRange);
    }

    cout << endl;
    //a.erase(--a.end());
    cout << "The size is: " <<a.size() << endl;
    cout << endl;
    for (List::iterator it = a.begin();it != a.end(); ++it)
    {
        cout << *it << endl;
    }
    //List::iterator it = a.begin();
    List::iterator min = a.begin();

    cout <<  endl;
    //cout << *min << endl;
    for (List::iterator it = a.begin();it != a.end(); ++it) {
        //++min;

            if (*it < *min) {
                //cout <<"1st it is : "<< *it << endl;
                //cout << "1st min is : " << *min << endl;
                *min = *it;
                //cout <<"this is min"<< *it << endl;




                //cout << "check" << endl;
                //cout << "smallest" << *min << endl;
            }


            //cout << "after if loop it is : " << *it << endl;
        //  cout << "after if loop min is : " << *min << endl;
            //cout << "check2" << endl;
    }
    cout <<"small" << *min << endl;
    //delete (*it);

    while (min != a.end())
    {
         a.erase(min);
    }

    for (List::iterator min ;min != a.end(); ++min)
    {
        cout << *min << endl;
    }
    return 0;
c++ minimum erase
1个回答
0
投票

当您调用

a.erase(min)
时,迭代器
min
就会失效。使用
min = a.erase(min)
,因为
erase
函数返回下一个迭代器。

编辑:但是,该更改并没有达到您想要的效果。 Main 函数应该是这样的:

int main()
{
    size_t n;
    cout << "Please enter the amount of random numbers to be generated " <<           endl;
    cin >> n;
    int randomRange;
    List a;

    srand(time(NULL));


    for (int i = 0; i < n;i++) {
        randomRange = rand() % 10000 + 1;
        a.insert(a.end(), randomRange);
    }

    cout << endl;
    cout << "The size is: " <<a.size() << endl;
    cout << endl;
    for (List::iterator it = a.begin();it != a.end(); ++it)
    {
        cout << *it << endl;
    }

    cout <<  endl;

    while (a.size()) // Repeat until size is zero
    {
        List::iterator min = a.begin(); // Initialize the minimum iterator
        for (List::iterator it = a.begin();it != a.end(); ++it) {

                if (*it < *min)
                {
                    // New minimum found, save iterator, not value.
                    min = it;
                }
        }
        cout <<"small: " << *min << endl; // print the minimum
        a.erase(min);  // Erase the minimum
    }

    return 0;
}

编辑:或者,您可以对列表进行排序,然后只打印内容。主要功能可以是:

int main()
{
    size_t n;
    cout << "Please enter the amount of random numbers to be generated " <<           endl;
    cin >> n;
    int randomRange;
    List a;

    srand(time(NULL));


    for (size_t i = 0; i < n;i++) {
        randomRange = rand() % 10000 + 1;
        a.insert(a.end(), randomRange);
    }

    cout << endl;

    cout << "The size is: " <<a.size() << endl;
    cout << endl;
    for (List::iterator it = a.begin();it != a.end(); ++it)
    {
        cout << *it << endl;
    }
    cout <<  endl;

    // Use bubble sort
    for (List::iterator it1 = a.begin(); it1 != a.end(); ++it1)
    for (List::iterator it2 = a.begin(); it2 != it1; ++it2)
    {
        List::iterator it3 = ++it2; --it2; // Your iterators does not support arithmetic...
        if (*it2 > *it3)
        {
            std::swap(*it2, *it3);
        }
    }

    for (List::iterator min = a.begin() ;min != a.end(); ++min)
    {
        cout << *min << endl;
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.