首页 > 解决方案 > 为什么我的单链表中的迭代器类在 C++ 中给我一个分段错误?

问题描述

全部。

我目前正在处理我的单链表,并在我的迭代器类中遇到了障碍。到目前为止,这就是我所拥有的,我将从节点开始,然后是单链表,然后是它自身的迭代器。

我的节点目前看起来像这样。对于下面我的代码中显示的“语法错误”,我提前道歉。如果不影响本网站中的代码文本,我将无法正确缩进。我仍然习惯于 stackoverflow 的工作方式。

#include <iostream>
#include <cstddef>
class SingleNode 
{
private:
     int key_;
     SingleNode * next_;
public:
      SingleNode(int key, SingleNode * next = NULL)
        : key_(key), next_(next)
     {
     }

     void set_key(int key)
     {
        key_ = key;
     }

     int get_key() const
     {
        return key_;
     }

     int & get_key()
     {
        return key_;
     }

     SingleNode * get_next() const
     {
        return next_;
     }

     SingleNode * set_next(SingleNode * next)
     {
        next_ = next;
     }
};

std::ostream & operator<<(std::ostream & cout, const SingleNode & node)
{
    cout << "< " << ' ' << &node << ' '
         << "key: " << node.get_key() << ' '
         << "next: " << node.get_next() << '>';
     return cout;
}

现在是我的单链表

#include <iostream>
#include <cstddef>
#include "SingleNode.h"

class SingleNode;

class SingleLinked
{
private:
    SingleNode * phead_;
public:
    SingleLinked()
       : phead_(NULL)
    {
    }

    class iterator
    {
        friend class SingleLinked;

    private:
        SingleNode * p;

        iterator(SingleNode * phead)
               : p(phead)
        {
        }

    public:
        iterator()
           : p(NULL)
        {
        }

        int & operator*()
        {
            return p->get_key();
        }

        int & operator++()
        {
            p = p->get_next();
        }
    };

    iterator begin() const
    {
        return iterator(phead_);
    }

    SingleNode * get_phead() const
    {
        return phead_;
    }

    SingleNode * insert_head(int key)
    {
         phead_ = new SingleNode(key, phead_);
    }

    SingleNode * insert_tail(int key)
    {
        SingleNode * p = new SingleNode(key, NULL);
        SingleNode * r = p;
        SingleNode * q = phead_;

        while (q->get_next() != NULL)
        {
            q = q->get_next();
        }
        q->set_next(r);
    }

    void delete_head()
    {
        SingleNode * p = phead_;
        phead_ = p->get_next();
    }

    void delete_tail()
    {
         SingleNode * p = phead_;
         while (p->get_next() != NULL)
         {
            p = p->get_next();
         }

         SingleNode * r = phead_;
         while (r->get_next() != p)
         {
            r = r->get_next();
         }

         r->set_next(NULL);
    }

    void print()
    {
        while (phead_ != NULL)
        {
           std::cout << *phead_ << std::endl;
           phead_ = phead_->get_next();
        }
    }
};

这个想法是这样的,我想使用 SingleLinked 类作为迭代器的朋友类。这样,一旦 SingleLinked 类在 main 中初始化,它就会自动在其中构造迭代器。一旦我开始使用开始方法,这就会遇到一些问题。

这是迄今为止的主要内容。

#include <iostream>
#include "SingleLinked.h"

int main()
{
     SingleLinked list;
     list.insert_head(1);
     list.insert_tail(2);

     typename SingleLinked::iterator p = list.begin();
     std::cout << *p << std::endl;
     return 0;
}

一旦我尝试计算该迭代器 p,它就会在控制台中显示分段错误。我的 SingleLinked 类本身内部发生了什么导致这种情况?

标签: c++listiteratorsegmentation-faultsingly-linked-list

解决方案


推荐阅读