双向链表的运算符“ <<”溢出。 C ++

时间:2019-10-22 20:06:45

标签: c++ operator-overloading doubly-linked-list ostream

我无法为我的双向链接列表创建“ <<”的重载函数。

这是我的头文件:


#ifndef SORTEDLIST_H
#define SORTEDLIST_H

#include <iostream>

class SortedList {

private:
    typedef struct node {
        int data;
        node* next;
        node* prev;
    }*nodePtr;

    int theSize;

    nodePtr head;
    nodePtr tail;

public:
    SortedList();
    //~SortedList();
    void insertItem(int inData);
    bool deleteItem(int delData);
    friend ostream& operator <<(ostream& ot, const SortedList& sL);
    int size() const;
    bool empty() const;



};



#endif

这是我的构造函数:

SortedList::SortedList() {
    //Set pointers equal to NULL
    head = NULL;
    tail = NULL;
    theSize = 0;

    head = new node; //create new node of 3 parts: head, data and prev
    tail = new node; //create new node of 3 parts: head, data and prev
    head->next = tail; //next partition points to tail
    head->prev = NULL; //not necessary to put in?
    tail->prev = head; //prev partition points to head
    tail->next = NULL; //not necessary to put in?
    /*temp->next = tail; //access the node the temp pointer is pointing to, set the 'next' part equal to tail*/

}

这是我无法使用的ostream重载函数:

ostream& operator<<(ostream& ot, const SortedList& sL)
{
    sL.nodePtr temp;
    temp = sL.head->next;
    while (temp != sL.tail) {
        ot << temp->data << " ";
        temp = temp->next;
    }
    ot << "\n";
}

它总是告诉我sL.NodePtr,sL.head,sL.tail无法访问。我确实将其设置为朋友功能,所以我不确定为什么。

2 个答案:

答案 0 :(得分:1)

operator<<的实现存在几个问题:

  • sL.nodePtr必须为SortedList::nodePtr

  • while循环是完全错误的。它不考虑空列表,并且忽略非空列表的tail节点。哦,等等,您的列表在其headtail中使用了 dummy 节点,这完全没有必要,只会使类的设计复杂化。完全摆脱假人。

  • 它没有return。它需要返回ot

尝试以下方法:

SortedList::SortedList() {
    //Set pointers equal to NULL
    head = NULL;
    tail = NULL;
    theSize = 0;
}

ostream& operator<<(ostream& ot, const SortedList& sL)
{
    SortedList::nodePtr temp = sL.head;
    while (temp) {
        ot << temp->data << " ";
        temp = temp->next;
    }
    ot << "\n";
    return ot;
}

或者,您可以使用for循环而不是while循环:

ostream& operator<<(ostream& ot, const SortedList& sL)
{
    for(SortedList::nodePtr temp = sL.head; temp; temp = temp->next) {
        ot << temp->data << " ";
    }
    ot << "\n";
    return ot;
}

答案 1 :(得分:0)

您的运算符重载不会返回任何内容,因此它有undefined behavior