c++:赋值中的非Ivalue

c++:赋值中的非Ivalue,c++,pointers,C++,Pointers,嗨,我想做一个外部单链表。我有一个问题,非Ivalue在分配和它发生在这一行=currP->next我试图使它currP.next,但它也产生了一个错误 #include <cstdlib> using namespace std; struct node{ int data; node *next; node(int i){ data = i; next = NULL;

嗨,我想做一个外部单链表。我有一个问题,非Ivalue在分配和它发生在这一行=currP->next我试图使它currP.next,但它也产生了一个错误

#include <cstdlib>
using namespace std;


struct node{
       int data;
       node *next;

       node(int i){
                data = i;
                next = NULL;
                }

       void insert(int position, node &n){
            node *currP = this;
            node *prevP= NULL;      
            for(int counter = 0; counter>=position;counter++, prevP = currP, currP = currP->next){
                    if(counter==position)
                    {
                    n.next  = currP->next;
                    currP->next = &n; 
                                         }                     
                    }

            }

       void add(node &n){
       next = &n;          
                 }
       void deleteNode(int i){
            node *currP = this;
            node *prevP = NULL;

            while(currP!= NULL){
               if(currP->data == i){
                  if(prevP == NULL) 
                      this = currP->next;
                  else{   
                      prevP->next = currP->next;
                  }                      
               }                                                  
               prevP = currP;
               currP = currP->next;
            }
        }
 };
左值是一个变量,可以位于equal运算符的左侧。这意味着它的值可以更改。你不能改变这个值,这是不允许的,因此会出现错误

您可以按如下方式重新编写函数:

    node* deleteNode(int i){
        if (  this->data == i )
           return this->next;
        else
        {
           if ( this->next )
              this->next = this->next->deleteNode(i);
           else
              return this;
        }
    }
deleteNode现在将返回指向列表其余部分开始的指针,递归算法将连接第一部分和最后一部分。它没有经过测试,所以可能需要进行一些调整,但我希望您能理解这一点。

左值是一个变量,它可以位于相等运算符的左侧。这意味着它的值可以更改。你不能改变这个值,这是不允许的,因此会出现错误

您可以按如下方式重新编写函数:

    node* deleteNode(int i){
        if (  this->data == i )
           return this->next;
        else
        {
           if ( this->next )
              this->next = this->next->deleteNode(i);
           else
              return this;
        }
    }

deleteNode现在将返回指向列表其余部分开始的指针,递归算法将连接第一部分和最后一部分。它没有经过测试,因此可能需要进行一些调整,但我希望您能理解这一点。

左值是一种语义规则。 它的意思是左值

左值的示例包括:

一个变量。伊阿 内存地址。即a[4]或*a+8
这不是左值。你不能给它分配任何东西。它是对方法调用方的引用。

左值是一种语义规则。 它的意思是左值

左值的示例包括:

一个变量。伊阿 内存地址。即a[4]或*a+8
这不是左值。你不能给它分配任何东西。它是对方法调用方的引用。

这不是变量。它是表示当前对象的关键字。无法通过尝试设置来更改当前对象。这不是变量。它是表示当前对象的关键字。您无法通过尝试设置来更改当前对象。如何使方法调用方变量next point指向currP->next points?this->next=currP->next;你可以像普通变量一样访问它,只是不能给它赋值。我怎样才能使方法调用方变量下一个点指向currP->next points?this->next=currP->next;你可以像普通变量一样访问它,你只是不能给它赋值。为了详细说明这个答案,你可以复制数据,而不是赋值给这个,对于这样一个简单的类,你可以用*this=*currP->next。如果您不知道区别是什么,请阅读更多关于指针解引用的内容。您可能会得到更详细的答案,但一般来说,我想问,为什么从列表中删除一个项是一种节点的方法。我试图将节点和列表作为一个结构,而不是列表和节点分开的XD。@Uffuse删除节点可能有意义,在这种情况下,函数的最佳名称不是deleteNode,而是~node--析构函数,但他的函数显然删除了列表中较低的任意节点。这样的函数应该是list类本身的一个成员,而不是节点的一个成员。@jko-我明白了,但正如@JamesKanze也指出的那样,我建议这是一个很差的关注点分离。拥有一个只包含一个成员的列表类是合理的:节点头;并将列表管理操作移到其中。另外,考虑一下如何表示空列表:它是空节点指针还是魔法哨兵节点?无论如何,这个问题很快就变得太大了,无法发表评论。为了详细说明这个答案,您可以复制数据,而不是分配给这个类,对于这样一个简单的类,您可以使用*this=*currP->next。如果您不知道区别是什么,请阅读更多关于指针解引用的内容。您可能会得到更详细的答案,但一般来说,我想问,为什么从列表中删除一个项是一种节点的方法。我试图将节点和列表作为一个结构,而不是列表和节点分开的XD。@Uffuse删除节点可能有意义,在这种情况下,函数的最佳名称不是deleteNode,而是~node--析构函数,但他的函数显然删除了列表中较低的任意节点。这样的函数应该是list类本身的一个成员,而不是节点的一个成员。@jko-我明白了,但正如@JamesKanze也指出的那样,我建议这是一个很差的关注点分离。拥有一个只包含一个成员的列表类是合理的:节点头;并将列表管理操作移到其中。另外,考虑一下如何表示空列表:它是空节点指针还是魔法哨兵节点?无论如何,这件事很快就变得太大了,无法发表评论。