C++ 38:10:错误:成员引用基类型';节点*';不是结构或联合体*prev->;下一个=温度;

C++ 38:10:错误:成员引用基类型';节点*';不是结构或联合体*prev->;下一个=温度;,c++,linked-list,C++,Linked List,代码是在链接列表的结束位置插入元素。我将指针传递给插入方法的节点指针,但这样做时,我得到的错误是,成员引用基类型“Node*”不是第38行的结构或联合,即*prev->next=temp。请解释这个问题,如果你提供相同逻辑的解决方案,它会更好 #include "iostream" using namespace std; struct Node { int data; Node* next; }; void insertElement(Node**, Node**, int);

代码是在链接列表的结束位置插入元素。我将指针传递给插入方法的节点指针,但这样做时,我得到的错误是,
成员引用基类型“Node*”不是第38行的结构或联合,即
*prev->next=temp。请解释这个问题,如果你提供相同逻辑的解决方案,它会更好

#include "iostream"

using namespace std;

struct Node {
  int data;
  Node* next;
};

void insertElement(Node**, Node**, int);
void printLinkList(Node** head);

int main(int argc, char const *argv[]) {
  Node *head = NULL, *prev = NULL;
  int num, pos;
  char controller;
  cout << "To add element to link list press y, to quit press any other key: ";
  cin >> controller;
  while(controller == 'y') {
    cout << "Enter element: ";
    cin >> num;
    insertElement(&head, &prev, num);
    cout << "To add next element to link list press y, to quit press any other key: ";
    cin >> controller;
  }
  printLinkList(&head);
  return 0;
}

void insertElement(Node **head, Node **prev, int num) {
  Node *temp = new Node();
  temp->data = num;
  temp->next = NULL;
  if(*head == NULL) {
    *head = temp;
  }
  if(*prev != NULL) {
    *prev->next = temp;
  }
  *prev = temp;
}

void printLinkList(Node** head) {
  Node* temp = *head;
  while(temp != NULL) {
    cout << temp->data << ", ";
    temp = temp->next;
  }
  cout << endl;
}
#包括“iostream”
使用名称空间std;
结构节点{
int数据;
节点*下一步;
};
void insertElement(节点**,节点**,int);
作废打印链接列表(节点**头);
int main(int argc,char const*argv[]{
节点*head=NULL,*prev=NULL;
int-num,pos;
字符控制器;
控制器;
而(控制器=='y'){
cout>num;
插入元素(&head,&prev,num);
控制器;
}
打印链接列表(&head);
返回0;
}
无效插入元素(节点**头,节点**上一个,整数){
Node*temp=新节点();
温度->数据=num;
temp->next=NULL;
如果(*head==NULL){
*压头=温度;
}
如果(*prev!=NULL){
*上一个->下一个=温度;
}
*prev=温度;
}
无效打印链接列表(节点**头){
节点*温度=*头部;
while(temp!=NULL){
下一步是收集数据;
}

cout如果您的表达式不那么复杂,那么错误消息将是不言自明的。但是,如果脱离上下文,它仍然是相当直接的

成员引用基类型“Node*”不是结构或联合

这意味着在某个时候您试图访问指向
节点的指针的成员,这是不允许的,因为只有结构和联合才有成员。(编译器使用“结构”来涵盖
结构和
),尤其是指针没有成员

希望这听起来是真的。如果
temp
是一个
节点*
,那么表达式
temp.data
没有意义;您需要首先取消引用指针,如
(*temp.data
或等效的
temp->data
。那么代码中发生了什么

在代码中有问题的地方,有一个指向指针的指针,这通常不是最好的方法。指向指针的指针,
prev
,出现在子表达式
prev->next
中,相当于
(*prev)因为下面的考虑最后一个表达式。自从代码> PREV 是“代码>节点** /代码>,一个DE引用给出了<代码>节点*这是上面的情况:试图访问<代码>下< /COD>字段是没有意义的,除非您首先引用指针,如<代码>(**PREV)。.next
。这与您编写的内容接近,但不完全相同

正确的表达式,
(**prev).next
相当于
(*prev)->next
。您的表达式,
*prev->next
,相当于
*(prev->next)
*(*prev).next)
。计算顺序存在差异。这种差异是指向指针的指针难以正确管理的原因之一。(该语言的设计不是为了简洁地容纳指向结构的指针。相反,它假设两级间接寻址的更可能场景是带有指针成员的指向结构的指针。)


<>你在C++中代替C语言编码,有一个很好的语言特性,有助于避免这个问题。有<代码>插入> <代码>接受<代码>节点>代码>指针,而不是地址。这减少了表达式的复杂性,消除了当前的问题,并解决了你从未检查过的将来问题。如果函数的参数为空。(您可以检查
*head
是否为空,但如果
head
本身为空,则该检查将失败。)

通过此更改,
head*
的函数体中出现的内容将变成
head
prev*
的函数体中出现的内容将变成
prev
,对函数的调用将变成
insertElement(head,prev,num);
(没有运算符的地址)。您可以获得更简单的语法,从而可以专注于插入元素的逻辑


另请参见。

了解运算符优先级。*prev->next是*(prev->next)在更改*prev->next to*(prev->next)后得到相同的错误@Pradosh是的,这些是等效的。您想要
(*prev)->next
这是否回答了您的问题?
void insertElement(Node *&head, Node *&prev, int num);