0

如何实现push_front()单链表的方法作为其成员函数?下面的代码无法编译 ( error: lvalue required as left operand of assignment),因为您不能分配给this指针。有什么办法解决这个问题?

#include<algorithm>
using namespace std;

class ListElem{
public:
    ListElem(int val): _val(val){}
    ListElem *next() const { return _next; }
    void next(ListElem *elem) { _next = elem; }
    void val(int val){ _val = val; }
    int val() const { return _val;}
    void print();
    void push_front(int);
private:
    ListElem *_next;    
    int _val;   
};

void ListElem::push_front(int val)
{
    ListElem *new_elem = new ListElem(val); //new node
    new_elem->next( this ); // new node points to old head
    this = new_elem; // make new node the new head, error!
    return;
}

void ListElem::print()
{
    ListElem *pelem = this;
    while(ListElem *pnext_elem = pelem->next())
    {   
        cout << pelem->val() << ' ';
        pelem = pnext_elem;    
    }   
    cout << pelem->val() << endl;
}

int main()
{
    //initialization
    ListElem *head = new ListElem(1);
    ListElem *elem = head;
    for (int ix = 2; ix < 10; ++ix)
    {   
        ListElem *elem_new = new ListElem(ix);
        elem -> next(elem_new);
        elem = elem_new;    
    }   
    head->print();  

    //insert at the beginning
    head->push_front(7);
    head->print();
}
4

3 回答 3

2

从逻辑上讲,push_front() 必须是类的方法,List而不是ListElement类的方法

于 2013-08-27T10:55:39.620 回答
1

你使用this不正确。你希望有一个static成员被调用,比如说,ListElem *head并在你使用的地方使用它this。您还必须初始化它。

于 2013-08-27T10:53:17.627 回答
1

如果你真的想这样做,你可以这样做:

void ListElem::push_front(int val)
{
    ListElem *new_elem = new ListElem(_val);
    _val = val;
    new_elem->next(_next);
    _next = new_elem;
}

这将用新数据替换“当前”节点中的数据,并将“当前”数据移动到新节点,这将产生相同的列表内容。
但是将列表与其节点混为一谈并不正确。

您链接的书对整个事物采用了非常非 OO 的方法(Java 和 C++ 示例看起来都像音译的 C),并且将列表的类型与其节点的类型混为一谈肯定会导致以后出现错误.

例如,如果你这样做

ListElem* x = head;
head->push_front(99);

那么 的内容*x将发生变化,这并不是您所期望的。

于 2013-08-27T11:28:17.273 回答