带有头类的c ++链表类

时间:2017-10-08 11:59:50

标签: c++ linked-list

我想用头类实现单链表,但我也在尝试将链表的信息和指针设为私有,编译器说我

  

左值作为赋值的左操作数                            pred->接着()= TEMP->接着();

这段代码有什么问题?

#include <iostream>
using namespace std;
class IntSLLNode{
        private:
            int info;
            IntSLLNode * next;
        public:
                IntSLLNode(){
                        next=0;
                }
                IntSLLNode(int el,IntSLLNode *ptr=0){
                        info=el;
                        next=ptr;
                }
        int Info(){return info;}
        IntSLLNode * Next(){return next;}
};
IntSLLNode * head,* tail;//header structure
class IntSLList{
        IntSLList(){
                head=0; tail=0;
        }
    public:
        void addToHead(const int&);
        void addToTail(const int &);
        int deleteFromHead();
        int deleteFromTail();
        void deleteNode(int&);
        void listele();
};
void IntSLList::addToHead(const int &el){
        head=new IntSLLNode(el,head);
        if(tail==0)
                tail=head;
}
void IntSLList::addToTail(const int &el){
        if(tail==0){
                head=tail=new IntSLLNode(el,head);
        }
        else{
                tail->Next()=new IntSLLNode(el);
                tail=tail->Next();
        }
}
int IntSLList::deleteFromHead(){
        if(head==0){
                cout<<"No value such that";
                return -1;
        }
        int el=head->Info();
        IntSLLNode * temp=head;
        if(head==tail){
                head=tail=0;
        }
        else{
                head=head->Next();
        }
        delete temp;
        return el;
}

2 个答案:

答案 0 :(得分:1)

首先,您需要了解左值和右值之间的区别。简单来说,左值是可以分配的(变量等),而右值是一个临时值(就像你在这里返回的那样:
IntSLLNode * Next(){return next;}
然后,通过尝试将某些内容分配给rvalue,您会收到错误 作为此处的解决方案,您可以将IntSLLNode * next;公开或在Next()函数中返回对此类成员的引用。

答案 1 :(得分:0)

对函数/方法的返回的赋值不会做任何有用的事情。您只能分配函数返回的值的引用

class IntSLLNode{
    ...
    int& Info(){return info;}
    IntSLLNode*& Next(){return next;}
};

但是,它会破坏该节点的封装,并允许任何外部代码错误地更改列表中节点的链接。我个人会将整个节点类隐藏到列表类中,并提供访问Info()值的方法,以便在此文件之外编码。